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

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-21 22:48
awsawzj 发表于 2019-4-28 11:00
是否需要开启总中断,中断函数里是否需要清除中断标志位

你说的是
NVIC_SETFAULTMASK();   //关闭总中断
NVIC_RESETFAULTMASK();//开放总中断
这个吧?
我用的是3.5的库,总中断也需要打开啊?
1599064432
2楼-- · 2019-07-22 04:07
 精彩回答 2  元偷偷看……
位卑未敢忘忧国
3楼-- · 2019-07-22 06:59
 精彩回答 2  元偷偷看……
位卑未敢忘忧国
4楼-- · 2019-07-22 11:57
nashui_sx 发表于 2019-4-28 09:59
你的代码我试了,没问题

谢谢你,我回去再试试,确实很奇怪
nashui_sx
5楼-- · 2019-07-22 12:38
1599064432 发表于 2019-4-28 15:26
请问你手上有串口采用DMA方式收发的例子吗,我刚学到DMA,,看了网上的资料还有点不太懂,Q1599064432, ...

http://www.openedv.com/forum.php ... d=273874&extra=
nashui_sx
6楼-- · 2019-07-22 13:09
位卑未敢忘忧国 发表于 2019-4-28 15:37
谢谢你,我回去再试试,确实很奇怪

我说的是这个初始化 和中断函数没问题,别的不能保证,这俩函数没问题

一周热门 更多>