首先声明我使用的是库函数开发,标准库的版本是V2.0.0,我下载的其他的高版本 V2.2.0也出现了同样的情况。我是一个STM8的初学者,之前一直在用STM32。大家说STM8很简单,公司正好也需要开发一款中低端的产品,借此机会,学习一下ST的8位机。
在调试串口的过程中发现串口初始化不能通过,莫名情况下,单片机就死掉了,以下是我串口配置的代码;
void USART1_Init(uint32_t Baudrate)
{
UART1_DeInit();
/* UART1 configuration ------------------------------------------------------*/
/* UART1 configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Receive and transmit enabled
- UART1 Clock disabled
*/
UART1_Init((uint32_t)Baudrate, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO,
UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
UART1_ITConfig(UART1_IT_RXNE, ENABLE);
UART1_Cmd(ENABLE);
}
因为配置串口打印数据输出对调试代码有很大的帮助,所以串口的前期阶段我并没有配置中断,并且我打开了void assert_failed(u8* file, u32 line)函数的,方便查看程序错误。
在我把中断加上去之后,串口输出了错误的信息。根据我在STM32串口中的逻辑这样配置是没有问题的,所以我并没有怀疑代码的配置会有任何的问题。随后自己硬件仿真的时候发现程序死在了中断配置这里。很是郁闷,不知道为什么会出现这种情况。检查了无数遍函数和函数的形参,确认没有问题之后,把中断配置这句去掉,再次仿真竟然一切正常。所以断定问题肯定是出现在这里。
当我仔细阅读库函数后同样没有发现问题的所在,无奈之下,结合百度搜索终于发现了问题所在,【敲黑板】
在检查参数函数中:assert_param(IS_UART1_CONFIG_IT_OK(UART1_IT));发现如下的定义:
#define IS_UART1_CONFIG_IT_OK(Interrupt)
(((Interrupt) == UART1_IT_PE) ||
((Interrupt) == UART1_IT_TXE) ||
((Interrupt) == UART1_IT_TC) ||
((Interrupt) == UART1_IT_RXNE_OR ) ||
((Interrupt) == UART1_IT_IDLE) ||
((Interrupt) == UART1_IT_LBDF))
仔细观察发现并没有UART1_IT_RXNE这句话,但是有UART1_IT_RXNE_OR,所以我在想,为什么ST的工程师这样做,在SR寄存器中的标志位也没有UART1_IT_RXNE_OR标志位;至今还没有想明白ST为什么这样做。如有高手指导,欢迎探讨。
两种修改方法:
①:修改标准库:把UART1_IT_RXNE这个加上去,如下所示
#define IS_UART1_CONFIG_IT_OK(Interrupt)
(((Interrupt) == UART1_IT_PE) ||
((Interrupt) == UART1_IT_TXE) ||
((Interrupt) == UART1_IT_TC) ||
((Interrupt) == UART1_IT_RXNE_OR ) ||
((Interrupt) == UART1_IT_RXNE ) || //注意这是自己手动添加的内容
((Interrupt) == UART1_IT_IDLE) ||
((Interrupt) == UART1_IT_LBDF))
②:把中断配置的形参参数改为UART1_IT_RXNE_OR。
两种方式均可,怎么取舍看自己。
文章中肯定会有表达错误的地方,欢迎大家拍砖,相互交流。
792028616@qq.com
一周热门 更多>