第一篇博客,记录一个找到BUG结果BUG变功能的悲惨的故事.
最近在做一个单片机的小项目,使用STM8的单片机,用到串口收发数据.前期图方便,直接用了个现成项目的模板,把硬件驱动都写好并测试成功了,然后看着莫名其妙的项目名,想着为了改个名,干脆重新新建个工程吧.没想到,竟因此发现了个BUG.
原先程序在main.c里面对串口进行初始化,串口初始化为
void UART_Init()
{
GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_IN_PU_NO_IT);
UART2_Init(19200,UART2_WORDLENGTH_8D,UART2_STOPBITS_1,UART2_PARITY_NO,UART2_SYNCMODE_CLOCK_DISABLE,UART2_MODE_TXRX_ENABLE);//19200,8,n,1,none,RT
UART2_ITConfig(UART2_IT_RXNE,ENABLE);//接收非空中断
UART2_Cmd(ENABLE);
}
旧工程里运行良好,但一直到新的工程里面后,总是卡在
UART_Init();
出不来.单步执行后发现是在
UART2_ITConfig(UART2_IT_RXNE,ENABLE);//接收非空中断
到这里比较有经验的人可能已经看出来问题在哪里了,但是我还是太嫩了点,只得继续找下去.
设置串口中断的函数在STM8的官方库里
void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState)
{
uint8_t uartreg = 0, itpos = 0x00;
/* Check the parameters */
assert_param(IS_UART2_CONFIG_IT_OK(UART2_IT));
assert_param(IS_FUNCTIONALSTATE_OK(NewState));
/* Get the UART2 register index */
uartreg = (uint8_t)((uint16_t)UART2_IT >> 0x08);
................................
运行的时候问题就出在
assert_param(IS_UART2_CONFIG_IT_OK(UART2_IT));
这条语句上.执行到这句后,就跳转到断言函数里去了