//主函数,主要是开启中断分组,如果不需要中断或中断分组在其他位置也可以
int main (void){//主程序
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
RCC_Configuration(); //时钟设置
USART1_Init();
while(1){
}
}
配置过程:初始化函数
void USART1_Init(void){
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
USART_InitTypeDef USART1_InitStructure; //定义USART1的初始化枚举结构
NVIC_InitTypeDef NVRC_InitStructure; // 定义NVRC的初始化枚举结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); //使能端口A时钟 和 USART1
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //发送
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //接收
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
GPIO_Init(GPIOA,&GPIO_InitStructure);
//串口参数,个人认为一般可以在头文件定义一个结构体,然后通过头文件修改过来,这里只是学习阶段
USART1_InitStructure.USART_BaudRate= 115200 ; //波特率
USART1_InitStructure.USART_WordLength= USART_WordLength_8b; //数据位
USART1_InitStructure.USART_StopBits= USART_StopBits_1; //停止位
USART1_InitStructure.USART_Parity= USART_Parity_No; //奇偶校验
USART1_InitStructure.USART_Mode= USART_Mode_Rx|USART_Mode_Tx; //收发
USART1_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; //硬件流
USART_Init(USART1,&USART1_InitStructure);
USART_Cmd(USART1, ENABLE); //使能串口
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启接收中断函数
//USART_IT_CTS: CTS change interrupt (not available for UART4 and UART5) 没看懂
//USART_IT_LBD: LIN Break detection interrupt
//USART_IT_TXE: Transmit Data Register empty interrupt //发送寄存器空,可以中断发用,但是用前开启,发完关闭。2022-4-20:根据原理来说TXE会比TC要快一些,
//USART_IT_TC: Transmission complete interrupt //传输完成中断,可以中断发送用,可以一直开着,但是发之前要清除标志位
//USART_IT_RXNE: Receive Data register not empty interrupt //接收非空,一般中断接收开启
//USART_IT_IDLE: Idle line detection interrupt //空闲中断 hal库时搭配DMA发送使用过,但是库函数还没使用, 后续测试再来
//USART_IT_PE: Parity Error interrupt //奇偶校验错误
//USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error)//错误终端
NVRC_InitStructure.NVIC_IRQChannel=USART1_IRQn; //中断通道
NVRC_InitStructure.NVIC_IRQChannelCmd = ENABLE ; //使能
NVRC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级
NVRC_InitStructure.NVIC_IRQChannelSubPriority =0; //响应优先级
NVIC_Init(&NVRC_InitStructure);
}
中断函数
//接收中断,
void USART1_IRQHandler(void){
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE)){
res=USART_ReceiveData(USART1);
USART_SendData(USART1,res);
}
}
-----------------------------2022-4-19