在使用stm32c8t6單片機時,由于需要使用兩個串口usart1 、usart2。usart1用作程序燒錄、調試作用,串口2用于與其它模塊進行通信。
使用串口1時,正常工作,使用串口2時,無反應。查閱了相關資料串口2在PA2\PA3 引腳上。RX\TX正反插無反應。最終找出原因是程序配置出現問題,但編譯是沒有報錯的。
下面是我個人發現的問題
問題程序:
void USART2_Init(u32 bound)
{//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//串口2在APB1時鐘線上 **********************沒開其APB1的時鐘*********/* 配置GPIO的模式和IO口 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//TX //串口輸出PA2GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口輸入IO */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//RX //串口輸入PA3GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模擬輸入GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO *///USART2 初始化設置USART_InitStructure.USART_BaudRate = bound;//波特率設置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_Cmd(USART2, ENABLE); //使能串口2 USART_ClearFlag(USART2, USART_FLAG_TC);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能接收中斷NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//Usart2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口1中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器、
}
?修正程序:
void USART2_Init(u32 bound)
{//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//串口2在APB1時鐘線上 **********************沒開其APB1的時鐘*********/* 配置GPIO的模式和IO口 */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//TX //串口輸出PA2GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復用推挽輸出GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口輸入IO */GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//RX //串口輸入PA3GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模擬輸入GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO *///USART2 初始化設置USART_InitStructure.USART_BaudRate = bound;//波特率設置USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_Cmd(USART2, ENABLE); //使能串口2 USART_ClearFlag(USART2, USART_FLAG_TC);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能接收中斷NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//Usart2 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口1中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//搶占優先級3NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器、
}
經過對比發現,問題出現在時鐘配置上。
?分析如下:
1、usart2在APB1總線上,而不是APB2。
2、usart2的時鐘開啟函數應為RCC_APB1PeriphClockCmd()。而不是RCC_APB2PeriphClockCmd()。
沒有開串口2時鐘,相當于人沒有了心臟,當然無法正常工作。
所以在復制或借用他人工程時,一定要檢查。