前言
最近弄了一块STM8L051/101F3开发板,打算简单玩一玩。在我IO和定时器都没问题后我开始配置串口UART时发现接收中断始终无法进入,发送中断都是没问题的,之后我就开始了为期两天的问题排查,几乎排查所有可能的问题点。
代码
我这里的MCU是STM8L051F3,使用的STM8库开发,代码如下仅供参考:
main.c
#include "stm8l15x.h"
void Clock_Config(void)
{
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //系统时钟分频器
CLK_SYSCLKSourceSwitchCmd(ENABLE); //开启系统时钟开关
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); //系统时钟源设置为内部高速时钟16MHz
while(CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI); //等待时钟切换
}
void GPIO_Config(void)
{
//USART GPIO
GPIO_Init(GPIOC, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT);
GPIO_Init(GPIOC, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);
SYSCFG_REMAPPinConfig(REMAP_Pin_USART1TxRxPortC, ENABLE);
}
void Usart_Config(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
USART_Init(USART1, (uint32)9600, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No, (USART_Mode_TypeDef)(USART_Mode_Tx | USART_Mode_Rx));
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_Cmd(USART1, ENABLE);
}
void main( void )
{
Clock_Config();
GPIO_Config();
Usart_Config();
enableInterrupts();
USART_SendData8(USART1, 0x55);
while(1)
{
}
}
void Usart1_RX_Callback(uint8_t data)
{
USART_SendData8(USART1, data);
}
stm8l15x_it.c
extern void Usart1_RX_Callback(uint8_t data);
/**
* @brief USART1 RX / Timer5 Capture/Compare Interrupt routine.
* @param None
* @retval None
*/
INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
if(USART_GetITStatus(USART1, USART_IT_RXNE))
{
// USART_ClearITPendingBit(USART1, USART_IT_RXNE);
Usart1_RX_Callback(USART_ReceiveData8(USART1));
}
}
问题排查
首先可以肯定的代码是没问题的,我已经对过规格书查看了仿真时的寄存器,所有的配置都是正确的。
接下来我偶然发现开发板是可以USB串口烧录程序的,使用的烧录口正是我使用的串口IO,随后我就在想是不是板载USB转串口芯片和外部USB转串口冲突了?
最后我拔下了板载的RXD跳线,结果串口接收中断进入了。。。
总结
如果开发板有板子USB转串口就不要再插USB转串口模块了(这不是废话嘛),否则有可能对串口收发产生影响导致无法接收串口数据。