void My_USART1_Init(void)
{
//结构体要先声明
NVIC_InitTypeDef NVIC_InitStructure; //中断结构体, 命名为NVIC_InitStructure
GPIO_InitTypeDef GPIO_InitStructure;//GPIO初始化结构体,命名为 GPIO_InitStructure
USART_InitTypeDef USART_InitStructure;//串口初始化结构体,命名为 USART_InitStructure
//1使能相应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口1时钟
//2配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PA9端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //串口输出要设置为推挽复用输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO口速度为10MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO初始化 ,串口输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA10端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //串口输出要设置为浮空输入或带上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //IO口速度为10MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO初始化 ,串口输出
//3配置串口
USART_InitStructure.USART_BaudRate = 115200; //波特率
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能功能,发送和接收都使能,用或运算
USART_InitStructure.USART_Parity = USART_Parity_No;//奇偶校验位
USART_InitStructure.USART_StopBits = 1;//停止位
USART_InitStructure.USART_WordLength = USART_WordLength_8b ;//字长
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);//串口使能函数
//4 把串口挂到中断上
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE );//串口1,接收到数据后开启中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断 //设置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级为1 设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2 设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
}
//4中断服务函数
void USART1_IRQandler(void)//串口USART1接收到数据就产生中断,产生中断后就执行这个函数
{
u8 res;
if(USART_GetITStatus(USART1,USART_IT_RXNE ))
/*STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(…,…);和USART_GetITStatus(…,…);,
两者容易混淆,重点区别就在于:前者返回值是中断标志位状态(读SR寄存器),
后者返回值是中断发生与否的判断(读CR寄存器)*/
{
res= USART_ReceiveData(USART1);//读取接收到的数据
USART_SendData(USART1,res);//发送数据
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //需要在main里先设置分组
My_USART1_Init();
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
谢谢你,我回去再试试,确实很奇怪
一周热门 更多>