当前位置:   article > 正文

STM32 | 请写一个函数输出如下波形(经典面试题)_bsp_spidelay

bsp_spidelay

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

前两天群友岸与桥在群里问了这样一个面试题:

看到这样一个问题,群里讨论得很热闹,几位群友也给出了一些解答,主要有两种思路:

① 第一种思路是:依次输出相应电平,高、低电平持续的时间根据题目要求确定即可。关键代码如下(代码来自昵称为宋阳的群友):

  1. // 微信公众号:嵌入式大杂烩
  2. static void plus(uint16_t h_times, uint16_t l_times) 
  3. {
  4.   IO_HIGH();
  5.   HAL_Delay(h_times);
  6.   IO_LOW();
  7.   HAL_Delay(l_times);
  8. }
  9. static void outplus(void) 
  10. {
  11.   plus(21);
  12.   plus(12);
  13.   plus(31);
  14.   plus(11);
  15.   plus(21);
  16.   plus(21);
  17.   plus(30);
  18. }

实际测试结果如下:

② 第二种思路是:可以把这个波形看做数据(0x1A75B7)来看待,这样一来就可以通过一个GPIO来按照这个数据输出相应的高低电平就可以得到对应的波形。关键代码如下(代码来自@_GWD上海-zak习道道等群友):

  1. // 微信公众号:嵌入式大杂烩
  2. uint32_t out_data = 0x1A75B7;
  3. static void WaveOutput(uint32_t data)
  4. {
  5.   int i;
  6.   for (i = 0; i < 21; i++)
  7.   {
  8.     if (data & 0x100000)
  9.     {
  10.       IO_HIGH();
  11.     }
  12.     else
  13.     {
  14.       IO_LOW();
  15.     }
  16.     data <<= 1;
  17.     HAL_Delay(1);
  18.   }
  19. }

经过实测得到的波形与上面的方法得到的波形是一致的,都能满足题目的要求。

针对这个题目,似乎按照第一种方法能更快地做出来。但是,我觉得这道题目真正要考察的应该是第二种思路,因为这个思路就是软件I2C、SPI的套路呀,想要考察我们会不会使用GPIO模拟一些总线协议。

软件I2C的发送函数(代码来自:安富莱):

  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名: i2c_SendByte
  4. * 功能说明: CPU向I2C总线设备发送8bit数据
  5. * 形    参:  _ucByte : 等待发送的字节
  6. * 返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void i2c_SendByte(uint8_t _ucByte)
  10. {
  11.  uint8_t i;
  12.  /* 先发送字节的高位bit7 */
  13.  for (i = 0; i < 8; i++)
  14.  {
  15.   if (_ucByte & 0x80)
  16.   {
  17.    I2C_SDA_1();
  18.   }
  19.   else
  20.   {
  21.    I2C_SDA_0();
  22.   }
  23.   i2c_Delay();
  24.   I2C_SCL_1();
  25.   i2c_Delay();
  26.   I2C_SCL_0();
  27.   if (i == 7)
  28.   {
  29.     I2C_SDA_1(); // 释放总线
  30.   }
  31.   _ucByte <<= 1/* 左移一个bit */
  32.   i2c_Delay();
  33.  }
  34. }

软件SPI的发送函数(代码来自:安富莱):

  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名: bsp_spiWrite0
  4. * 功能说明: 向SPI总线发送一个字节。SCK上升沿采集数据, SCK空闲时为低电平。
  5. * 形    参: 无
  6. * 返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. void bsp_spiWrite0(uint8_t _ucByte)
  10. {
  11.  uint8_t i;
  12.  for(i = 0; i < 8; i++)
  13.  {
  14.   if (_ucByte & 0x80)
  15.   {
  16.    MOSI_1();
  17.   }
  18.   else
  19.   {
  20.    MOSI_0();
  21.   }
  22.   bsp_spiDelay();
  23.   SCK_1();
  24.   _ucByte <<= 1;
  25.   bsp_spiDelay();
  26.   SCK_0();
  27.  }
  28.  bsp_spiDelay();
  29. }

看看,是不是一样的套路。SPI、I2C是两块重中之重的知识,而且也是我们嵌入式笔试面试中的高频考点,需要我们反复去理解,吸收。

本篇文章相关的工程、资料已整理好,在公众号后台回复暗号:请写一个函数输出如下波形,即可获取。

为了便于公众号读者交流学习,小编创建了相关相关交流群。坑位有限,感兴趣的朋友可以扫码下方二维码加我微信,由我邀请入群:

欢迎大家进群交流、共同进步。同时,我也会关注一些大家问的一些问题,从中挑选一些具有代表性的、并且在我知识范围内的问题写出相关文章做分享。

猜你喜欢

C语言、嵌入式中几个非常实用的宏技巧

串口打印知多少?

串口通讯你真的会了吗?不妨看看这些经验

一种简单、实用的测量程序运行时间的方法

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/205649
推荐阅读
相关标签
  

闽ICP备14008679号