串口通讯,按照原子哥视频操作的,可是不能实现发送接收

2019-07-21 02:13发布


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);
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
位卑未敢忘忧国
1楼-- · 2019-07-22 16:57
 精彩回答 2  元偷偷看……
nashui_sx
2楼-- · 2019-07-22 21:17
位卑未敢忘忧国 发表于 2019-4-28 20:44
麻烦大神帮我编译一下试试,看看问题出在什么地方

USART1_IRQandler
USART1_IRQHandler
给你测试的时候直接粘贴的函数内部,你这写错了
位卑未敢忘忧国
3楼-- · 2019-07-22 23:24
 精彩回答 2  元偷偷看……

一周热门 更多>