前言
最近弄了一塊STM8L051/101F3開發(fā)板蟹腾,打算簡(jiǎn)單玩一玩膀跌。在我IO和定時(shí)器都沒問題后我開始配置串口UART時(shí)發(fā)現(xiàn)接收中斷始終無法進(jìn)入芍躏,發(fā)送中斷都是沒問題的奠涌,之后我就開始了為期兩天的問題排查宪巨,幾乎排查所有可能的問題點(diǎn)。
STM8L051/101F3開發(fā)板
代碼
我這里的MCU是STM8L051F3溜畅,使用的STM8庫(kù)開發(fā)捏卓,代碼如下僅供參考:
main.c
#include "stm8l15x.h"
void Clock_Config(void)
{
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //系統(tǒng)時(shí)鐘分頻器
CLK_SYSCLKSourceSwitchCmd(ENABLE); //開啟系統(tǒng)時(shí)鐘開關(guān)
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); //系統(tǒng)時(shí)鐘源設(shè)置為內(nèi)部高速時(shí)鐘16MHz
while(CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI); //等待時(shí)鐘切換
}
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));
}
}
問題排查
首先可以肯定的代碼是沒問題的,我已經(jīng)對(duì)過規(guī)格書查看了仿真時(shí)的寄存器慈格,所有的配置都是正確的怠晴。
接下來我偶然發(fā)現(xiàn)開發(fā)板是可以USB串口燒錄程序的,使用的燒錄口正是我使用的串口IO浴捆,隨后我就在想是不是板載USB轉(zhuǎn)串口芯片和外部USB轉(zhuǎn)串口沖突了蒜田?
最后我拔下了板載的RXD跳線,結(jié)果串口接收中斷進(jìn)入了选泻。冲粤。。
拔掉RXD跳線
總結(jié)
如果開發(fā)板有板子USB轉(zhuǎn)串口就不要再插USB轉(zhuǎn)串口模塊了(這不是廢話嘛)页眯,否則有可能對(duì)串口收發(fā)產(chǎn)生影響導(dǎo)致無法接收串口數(shù)據(jù)梯捕。