搜索
bottom↓
回复: 25

STM32F30x标准库, 又踩坑了

[复制链接]

出0入362汤圆

发表于 2020-8-18 11:45:56 | 显示全部楼层 |阅读模式
项目需要同时用到ADC1和ADC2, 之前只用了ADC2, 于是把ADC的整个配置函数整个复制粘贴了一遍, 再把里面的ADC2改成ADC1, 中断/DMA之类也一起改过来.

结果发现ADC1正常, ADC2不工作. 排查发现是ADC1配置函数开头的ADC_DeInit(ADC1)这一行, 会导致ADC2停止工作.

查库源代码, 果然是这样. 去掉ADC_DeInit(ADC1), ADC2恢复正常.

  1. /**
  2.   * @brief  Deinitializes the ADCx peripheral registers to their default reset values.
  3.   * @param  ADCx: where x can be 1, 2,3 or 4 to select the ADC peripheral.
  4.   * @retval None
  5.   */
  6. void ADC_DeInit(ADC_TypeDef* ADCx)
  7. {
  8.   /* Check the parameters */
  9.   assert_param(IS_ADC_ALL_PERIPH(ADCx));


  10.   if((ADCx == ADC1) || (ADCx == ADC2))
  11.   {
  12.     /* Enable ADC1/ADC2 reset state */                  
  13.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ADC12, ENABLE);     // 这里, ADC1和ADC2一起给复位了...................
  14.     /* Release ADC1/ADC2 from reset state */
  15.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ADC12, DISABLE);
  16.   }
  17.   else if((ADCx == ADC3) || (ADCx == ADC4))
  18.   {
  19.     /* Enable ADC3/ADC4 reset state */
  20.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ADC34, ENABLE);
  21.     /* Release ADC3/ADC4 from reset state */
  22.     RCC_AHBPeriphResetCmd(RCC_AHBPeriph_ADC34, DISABLE);
  23.   }
  24. }
复制代码


阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入53汤圆

发表于 2020-8-18 11:55:08 | 显示全部楼层
HAL库绕来绕去,感觉还不如标准库好用,指哪打哪

出0入4汤圆

发表于 2020-8-18 11:55:24 | 显示全部楼层
是时候用LL库了

出0入0汤圆

发表于 2020-8-18 13:04:07 | 显示全部楼层
ll库,感觉特好用

出0入442汤圆

发表于 2020-8-18 22:30:37 来自手机 | 显示全部楼层
zhcj66 发表于 2020-8-18 11:55
HAL库绕来绕去,感觉还不如标准库好用,指哪打哪

不止这个问题。当时调stm32l0的uart中断,死活只能进一次,最后没办法我把整个hal底层大改一遍,让中断进入之后直接调我的api然后返回,于是一切问题都解决了。

出0入53汤圆

发表于 2020-8-21 08:35:39 | 显示全部楼层
wye11083 发表于 2020-8-18 22:30
不止这个问题。当时调stm32l0的uart中断,死活只能进一次,最后没办法我把整个hal底层大改一遍,让中断进 ...

用的串口1接收中断进入<HAL_UART_IRQHandler(&huart1);>然后把接收到的数据在发送出来,10ms发送一个20位的数据,结果丢数据,

直接用
void UART1_Putc(unsigned char data)
{
        while (!(USART1->ISR & UART_FLAG_TXE));
        USART1->TDR = (data & (uint16_t)0x01FF);
}

void USART1_IRQHandler(void)
{
//        HAL_UART_IRQHandler(&huart1);
        UART1_Putc(USART1->RDR);
}
不丢数据,改为1ms收发一次也不丢数据,感觉HAL用做初始化还行,运行的话效率不高

出0入18汤圆

发表于 2020-8-21 08:46:48 | 显示全部楼层
HAL 把系统搞的太复杂了。什么都想接管,结果什么都没管好。

出100入101汤圆

发表于 2020-8-21 08:54:03 | 显示全部楼层
hal库有坑

出0入0汤圆

发表于 2020-8-21 09:03:11 | 显示全部楼层
串口,用过封装多层的库,政治正确,使用起来不如自己简单粗暴封装的稳定有效。

出0入0汤圆

发表于 2020-8-21 09:08:24 | 显示全部楼层
F2的USB标准库也有类似问题,两个USB口同时用的时候有问题

出0入442汤圆

发表于 2020-8-21 09:26:31 来自手机 | 显示全部楼层
zhcj66 发表于 2020-8-21 08:35
用的串口1接收中断进入然后把接收到的数据在发送出来,10ms发送一个20位的数据,结果丢数据,

直接用

你这是纯属扯淡。用中断的目的是把cpu解放出来,你倒好,让cpu死等。

一个技巧:你可以弄一个32深度的小fifo,一边写一边读,这样新地址=(地址+1)&(32-1)。

出0入53汤圆

发表于 2020-8-21 09:57:00 | 显示全部楼层
wye11083 发表于 2020-8-21 09:26
你这是纯属扯淡。用中断的目的是把cpu解放出来,你倒好,让cpu死等。

一个技巧:你可以弄一个32深度的小 ...

你理解错了,我是刚用 Cube,所以想通过串口这个例子,对HAL做一个了解
真正使用的时候,用的是DMA收发解放cpu中途敢于

出0入53汤圆

发表于 2020-8-21 10:07:11 | 显示全部楼层
wye11083 发表于 2020-8-21 09:26
你这是纯属扯淡。用中断的目的是把cpu解放出来,你倒好,让cpu死等。

一个技巧:你可以弄一个32深度的小 ...

说到死等这个问题了,裸奔在遇到模拟iic的时候,需要延时跳变通信线,一般做法是处理完了这里,在去做别的工作,实在是太浪费cpu了,还有更好的办法处理类似情况实现延时的吗?

出215入118汤圆

发表于 2020-8-21 12:27:03 来自手机 | 显示全部楼层
ll库好用,就是很多还依赖于hal。什么时候完全独立才好。

出0入442汤圆

发表于 2020-8-21 13:08:58 来自手机 | 显示全部楼层
zhcj66 发表于 2020-8-21 10:07
说到死等这个问题了,裸奔在遇到模拟iic的时候,需要延时跳变通信线,一般做法是处理完了这里,在去做别的工 ...

模拟的没办法,只能死等。此时中断可以继续,但是绝对不要在中断里操作iic。或者是用定时器中断操作iic,这样会浪费很多cpu花在上下文切换,但是用户程序不允许访问iic。

出0入362汤圆

 楼主| 发表于 2020-8-21 15:04:14 | 显示全部楼层
zhcj66 发表于 2020-8-21 10:07
说到死等这个问题了,裸奔在遇到模拟iic的时候,需要延时跳变通信线,一般做法是处理完了这里,在去做别的工 ...

数据量小的比如传感器之类用模拟i2c还行, 数据量大的比如oled屏这样的, 最好还是用硬件i2c+dma吧.
安利个我的软i2c主机库, 实现了平台无关.

https://github.com/tomzbj/zi2c

出0入53汤圆

发表于 2020-8-26 16:03:57 | 显示全部楼层
tomzbj 发表于 2020-8-21 15:04
数据量小的比如传感器之类用模拟i2c还行, 数据量大的比如oled屏这样的, 最好还是用硬件i2c+dma吧.
安利个 ...

stm32f1 不是你说iic一直有问题吗?现在改了?

出0入362汤圆

 楼主| 发表于 2020-8-26 22:27:53 | 显示全部楼层
zhcj66 发表于 2020-8-26 16:03
stm32f1 不是你说iic一直有问题吗?现在改了?

oled比较特殊, 基本只是写, 不用读, 所以还好

出0入53汤圆

发表于 2020-8-27 08:23:15 | 显示全部楼层
本帖最后由 zhcj66 于 2020-8-27 08:24 编辑
tomzbj 发表于 2020-8-26 22:27
oled比较特殊, 基本只是写, 不用读, 所以还好


我看OLED好多都写着是spi 但是实际标准的时候是SDA SCK  为啥不直接写IIC反而写SPI?

git那个封装iic是你搞的?

出0入362汤圆

 楼主| 发表于 2020-8-27 08:55:21 | 显示全部楼层
zhcj66 发表于 2020-8-27 08:23
我看OLED好多都写着是spi 但是实际标准的时候是SDA SCK  为啥不直接写IIC反而写SPI?

git那个封装iic是你 ...

ssd1306? i2c和spi它都支持呀.

git那个zi2c? 我写的.

出0入0汤圆

发表于 2020-8-27 13:18:00 | 显示全部楼层
zhcj66 发表于 2020-8-26 16:03
stm32f1 不是你说iic一直有问题吗?现在改了?

都什么年代了,莫非ST的IIC还有问题?M0 M4 的硬件IIC 用了很久了,没发现问题。倒是M3的一直没机会用。

出0入53汤圆

发表于 2020-8-27 21:13:28 | 显示全部楼层
account 发表于 2020-8-27 13:18
都什么年代了,莫非ST的IIC还有问题?M0 M4 的硬件IIC 用了很久了,没发现问题。倒是M3的一直没机会用。 ...

听好多人说iic出现过问题,当时12年也出现了问题,以后就没有用过

出0入0汤圆

发表于 2020-8-28 09:17:27 | 显示全部楼层
zhcj66 发表于 2020-8-27 21:13
听好多人说iic出现过问题,当时12年也出现了问题,以后就没有用过

确实是这样,很多人本来准备用,然后网上一查都是说bug,立马就放弃了,所以这都7,8年过去了,不知道到底还有没有bug

出0入53汤圆

发表于 2020-8-28 12:58:12 | 显示全部楼层
account 发表于 2020-8-28 09:17
确实是这样,很多人本来准备用,然后网上一查都是说bug,立马就放弃了,所以这都7,8年过去了,不知道到 ...

8年前,iic是偶发出现,谁也不可能在因为这个iic去验证他去吧,万一在出现一批问题,得不偿失,所以就彻底放弃

出0入0汤圆

发表于 2020-8-29 05:49:41 来自手机 | 显示全部楼层
我个人习惯LL库,用着心里放心。

出0入0汤圆

发表于 2020-8-29 09:04:02 | 显示全部楼层
3系列还不支持位带操作功能,我直接把1系列的程序移植到3系列上,稍微修改一下,除了IO操作怎么都不工作,其他都正常。看了手册才知道我掉坑里了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 17:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表