使用CX32L003的串口必须给使用外部晶振,内部时钟精度太低,实验室玩玩可以用,做产品千万别给自己埋雷。
以下都是使用外挂24MHz晶振的,CX32L003的UART有点怪,厂家给的UART收发例程应该有点问题。
void UART1_IRQHandler(void)//USART1中断
{
if((UART1->INTSR&UART_INTSR_RI)!=RESET) //接收完成中断有效
{
UART1->INTCLR|=UART_INTSR_RI;//清除接收完成中断标志位
UART1_BUFFER[u16CNT_1]=(UART1->SBUF); //读取接收数据
u16CNT_1=u16CNT_1+1;
}
}
void UART1_Baud_Port_Cfg(unsigned long Baudrate)//USART1波特率设置,引脚配置
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOD_CLK_ENABLE();
/**if UARTx is UART0
GPIO Configuration:
PD6 ------> UART1_RXD
PD5 ------> UART1_TXD
*/
GPIO_InitStruct.Pin = GPIO_PIN_6;//PD6-RX
GPIO_InitStruct.Mode = GPIO_MODE_AF;
GPIO_InitStruct.OpenDrain = GPIO_PUSHPULL;
GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_DISABLE;
GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
GPIO_InitStruct.DrvStrength = GPIO_DRV_STRENGTH_HIGH;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Alternate = GPIO_AF5_UART1_RXD;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF;
GPIO_InitStruct.Alternate = GPIO_AF5_UART1_TXD;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
RCC->PCLKEN|=RCC_PCLKEN_UART1CKEN;//UART1时钟开启(UART1 PCLK 时钟使能)
UART1->SCON|=UART_SCON_RIEN;//打开接收完成中断使能
UART1->SCON&=~UART_SCON_TIEN;//关闭发送完成中断使能
UART1->SCON&=~UART_SCON_SM2_Msk;//关闭多从机通讯以及地址自动匹配
UART1->SCON|=UART_SCON_SM0_SM1_1;//8位数据格式
UART1->SCON|=UART_SCON_DBAUD;//双波特率打开
UART1->BAUDCR|=(2*(HAL_RCC_GetPCLKFreq())/(32*(Baudrate))+1);//双倍波特率
//UART1->BAUDCR|=(1*(HAL_RCC_GetPCLKFreq())/(32*(Baudrate))+1);//单倍波特率
UART1->BAUDCR|=UART_BAUDCR_SELF_BRG;
NVIC_EnableIRQ(UART1_IRQn);
UART1->SCON|=UART_SCON_REN;//接收和发送使能//只能定义在这,如果初始化的时候早于打开中断设置,就会中断开启后进入接收中断一次
NVIC_SetPriority(UART1_IRQn,PRIORITY_LOW);
}