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条回答
Admin
1楼-- · 2019-07-21 23:28
在你的头文件usart.h中添加
extern u8 USART2_RX_BUF[64];     //接收缓冲,最大64个字节.
extern u8 USART2_RX_STA;       //接收状态标记

#define EN_USART2_RX   //如果使能了接收
void uart2_init(u32 pclk2,u32 bound);


编译即可通过
慢慢学
2楼-- · 2019-07-22 00:58
恩 回复【10楼】fby19860519:
---------------------------------
恩 是的
fby19860519
3楼-- · 2019-07-22 02:49
 精彩回答 2  元偷偷看……
慢慢学
4楼-- · 2019-07-22 03:52
问一下:两个串口同时使用时,usart2怎么接线的?
慢慢学
5楼-- · 2019-07-22 09:27
回复【13楼】fby19860519:
---------------------------------
在板子上 A2和PA3就分别是发送和接收呀  原理图上有  当然 重映射的话就还要使能映射的端口
fby19860519
6楼-- · 2019-07-22 12:57
回复【8楼】Admin:
---------------------------------
pclk2应该改为pclk1吧  串口2的波特率也是原来的一半好像

一周热门 更多>