想在原子哥串口程序上加个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确是有错,哪位大神指导一下错在哪~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>