stm32的usart1和usart2两个串口同时使用问题

2019-07-21 08:55发布

想在原子哥串口程序上加个usart2同时工作,但是修改过后出现错误
贴下程序
usart.h部分
#ifndef __USART_H #define __USART_H #include <stm32f10x_lib.h> #include "stdio.h" extern u8 USART_RX_BUF[64], USART2_RX_BUF[64] ;     //接收缓冲,最大63个字节.末字节为换行符  extern u8 USART_RX_STA,USART2_RX_STA;         //接收状态标记 //如果想串口中断接收,请不要注释以下宏定义 #define EN_USART1_RX //使能串口1接收 void uart_init(u32 pclk2,u32 bound); #define EN_USART2_RX //使能串口2接收 void uart2_init(u32 pclk2,u32 bound); #endif

usart.c部分
#include "sys.h" #include "usart.h" #include "led.h" #include "delay.h"
这里是#ifdef EN_USART1_RX下面的格式是按照#ifdef EN_USART1_RX修改的 #ifdef EN_USART2_RX   //如果使能了接收 u8 USART2_RX_BUF[64];     //接收缓冲,最大64个字节. u8 USART2_RX_STA=0;       //接收状态标记 u8 flag2=0; void USART2_IRQHandler(void) {     u8 res2;       if(USART2->SR&(1<<5))//接收到数据  {     res2=USART2->DR; if((USART2_RX_STA&0x80)==0)//接收未完成 {         flag2=flag2+res2; if(res2==flag2)//接收到了0x0d  {                           USART2_RX_STA|=0x80; //接收完成了  }   else //还没收到0X0D {                          USART2_RX_BUF[USART2_RX_STA]=res2;                          USART2_RX_STA++;                          } }               if(USART2_RX_STA>63)          USART2_RX_STA=0;//接收数据错误,重新开始接收     }     } #endif
这有一块uart_init()被我省略了,下面是uart2_init的 void uart2_init(u32 pclk2,u32 bound) {        float temp;    u16 mantissa;    u16 fraction;        temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV    mantissa=temp;     //得到整数部分    fraction=(temp-mantissa)*16; //得到小数部分      mantissa<<=4;    mantissa+=fraction;     RCC->APB2ENR|=1<<2;   //使能PORTA口时钟      RCC->APB1ENR|=1<<17;  //使能串口时钟     GPIOA->CRL&=0XFFFF00FF;     GPIOA->CRL|=0X00008B00;//IO状态设置         RCC->APB1RSTR|=1<<17;   //复位串口2    RCC->APB1RSTR&=~(1<<17);//停止复位            //波特率设置    USART2->BRR=mantissa; // 波特率设置      USART2->CR1|=0X200C;  //1位停止,无校验位. #ifdef EN_USART2_RX    //如果使能了接收    //使能接收中断    USART2->CR1|=1<<8;    //PE中断使能    USART2->CR1|=1<<5;    //接收缓冲区非空中断使能          MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级  #endif }
下面是test.c的主要程序
#include <stm32f10x_lib.h> #include "sys.h" #include "usart.h" #include "delay.h" int main(void) { u8 t; // u8 len; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72);      //延时初始化  uart_init(72,9600);  //串口1初始化为9600 uart2_init(72,9600);  //串口2初始化为9600 LED_Init();     //初始化与LED连接的硬件接口       while(1) {
              这里是USART_RX_STA&0x80的判断,下面是usart2的,格式是相同的              if(USART2_RX_STA&0x80) {     // len=USART_RX_STA&0x3f;//得到此次接收到的数据长度 for(t=0;t<4;t++) { USART2->DR=USART2_RX_BUF[t]; while((USART2->SR&0X40)==0);//等待发送结束 }USART2_RX_STA=0; } }   } 主要修改的就是填 {MOD}部分所标注的,最后编译给出test.c(19): warning:  #223-D: function "uart2_init" declared implicitly                                                                   test.c(40): error:  #20: identifier "USART2_RX_STA" is undefined                                                                   test.c(47): error:  #20: identifier "USART2_RX_BUF" is undefined
这样的错误,单独运行修改后的原子哥的串口1程序是可以的,但是不改usart1的情况下添了usart2确是有错,哪位大神指导一下错在哪~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
慢慢学
1楼-- · 2019-07-22 17:49
您好!我试了一下您的程序   程序的意思是随便usart1与usart2 的哪一个与usb的tx  rx连接在一起,输入4长度的数据,都可以向单片机发送并单片机能够返回是么?为什么不行呢?
慢慢学
2楼-- · 2019-07-22 23:03
 精彩回答 2  元偷偷看……
tyk
3楼-- · 2019-07-23 04:42
usart_init(36,9600);

一周热门 更多>