单片机
文章平均质量分 63
披着假发的程序唐
嵌入式软件工程师,擅长linux开发、单片机开发、OTN光通信协议解析、卫星导航相关
展开
-
STM32/GD32学习指南-踩坑之(五)串口收发数据的三种方式:UART接收中断、UART+DMA空闲中断、UART+DMA超时中断,接收不定长数据,纯干货,有史以来最详细的讲解,附源码
串口收发数据的三种方式:UART接收中断、UART+DMA空闲中断接收不定长数据、UART+DMA超时中断接收不定长数据;该种方式使用DMA(直接内存存取器)接收串口数据,中断标志为:USART_INT_IDLE;该种方式在串口RX处于空闲状态时,会触发中断,也就是一帧数据接收完成后,串口RX不再收到数据,即可触发空闲中断,此时可以将接收到的数据提取出来,由于使用DMA接收,所以可以接收不定长数据,并且数据接收过程中不需要CPU的参与,只是在数据接收完的时候,会触发一次空闲中断才涉及到CPU参与原创 2024-02-29 16:22:11 · 5632 阅读 · 5 评论 -
STM32/GD32学习指南-踩坑之(四)GPIO作为简单IO,配置为输出模式时初始状态的注意事项
无论是GD32还是STM32,当GPIO配置为输出模式时,初始化完成后,都有一个初始的输出状态,有的可能时高电平,有的可能是低电平,不配置的话,可能初始化后一瞬间的上升或下降沿信号的输出,会对一些外围器件产生期望之外的操作等。在初始化代码前,先将GPIO的输出寄存器置高,再对GPIO初始化,用示波器测量,低电平的时间从2ms变成了1ms,时间缩短了,对应控制的外设确实没有被复位,但是还是有风险。所有GPIO配置为输出模式时,初始化后需要给一个确定的输出状态,GPIO_BOP为置高,GPIO_BC为置低。原创 2023-08-29 11:29:32 · 2533 阅读 · 0 评论 -
STM32/GD32学习指南-踩坑之(三)环形buffer使用方法,环形缓存区的读取操作方法
例如:现在有一个串口,接收到外部发来的数据,将其存入到环形buffer中,然后再从该环形buffer中将数据读取出来,进行一些帧格式、数据校验的操作,再从该串口发送出去。在处理接收数据时,经常使用到环形buffer存储数据进行处理,尤其是单片机中,内存本来就小,就需要节约内存的使用。Head:当前队列头部,也就是下次数据读取时的首地址,根据数据的存取状态,是动态变化的。Tail:当前队列尾,也就是下次数据写入时的首地址,根据数据的存取状态,是动态变化的。3. 读取环形buffer中的数据。原创 2023-07-14 17:24:42 · 1441 阅读 · 1 评论 -
STM32/GD32学习指南-踩坑之(二)关于堆栈空间大小配置的问题
图中Heap_Size就是堆空间大小的配置,堆空间主要是程序员自己申请的空间,例如malloc,new申请的内存占用堆空间,用完后需要使用free或delete手动释放,否则会造成内存泄漏、野指针的问题。图中Stack_Size就是栈空间大小的配置,一般函数内的局部变量占用栈空间,并且函数执行完毕后会被自动回收,根据自己的片子手册以及代码编写的使用,合理分配即可,例如图中的0x00000800,十进制是2048,即2MB空间的栈内存。打断点后,进入如下图所示的硬件错误中断函数中。开发过程中遇到如下问题。原创 2023-07-10 15:15:03 · 2807 阅读 · 5 评论 -
STM32/GD32学习指南-踩坑之(一)外部晶振配置,初始化失败,不起振
开发过程中,遇到GD32初始化时钟一直卡在system_clock_200m_25m_hxtal(void)函数里面,卡在了RCU_CTL_HXTALSTB标志位的检测。使用有源晶振的话,需要在上述system_clock_200m_25m_hxtal(void)中添加一句话,在RCU_CTL |= RCU_CTL_HXTALEN;跳转到__SYSTEM_CLOCK_200M_PLL_25M_HXTAL对应的系统时钟配置函数:system_clock_200m_25m_hxtal(void)原创 2023-06-12 15:56:57 · 2267 阅读 · 0 评论 -
STM32/GD32学习指南-踩坑之(一)外部晶振配置,初始化失败,不起振
GD32配置外部时钟,有源晶振和无源晶振原创 2023-06-12 11:37:30 · 7120 阅读 · 5 评论