代码如下
[mw_shl_code=c,true]U1_Init(72,9600);
while(1)
{
U1_send("hello/r/n");
//printf("hello/r/n");
delay_ms(500);
}[/mw_shl_code]
[mw_shl_code=c,true]#include "usart1.h"
#include "delay.h"
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
#include "dma.h"
__align(8) u8 U1_TX_BUF[U1_MAXSEND_LEN]; //
u8 U1_RX_BUF[U1_MAXRECV_LEN]; //
u16 U1_RX_STA=0; //
void USART1_IRQHandler(void)
{
u8 res;
if(USART1->SR&(1<<5))//接收到数据
{
res=USART1->DR;
if(U1_RX_STA<U1_MAXRECV_LEN) //还可以接收数据
{
TIM5->CNT=0; //计数器清空
if(U1_RX_STA==0)
TIM5_Set(1); //使能定时器5的中断
U1_RX_BUF[U1_RX_STA++]=res; //记录接收到的值
}else
{
U1_RX_STA|=1<<15; //强制标记接收完成
}
}
}
//初始化串口2
//pclk1  CLK1时钟频率(Mhz)
//bound:波特率
void U1_Init(u32 pclk1,u32 bound)
{
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=(pclk1*1000000)/(bound);// 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
USART1->CR3=1<<7; //使能串口2的DMA发送
UART_DMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)U1_TX_BUF);//DMA1通道4,外设为串口1,存储器为U1_TX_BUF
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,3,USART1_IRQn,2);//组2,优先级2,3
TIM5_Init(999,7199); //100ms中断
U1_RX_STA=0; //清零
TIM5_Set(1); //关闭定时器5
}
//串口2,printf 函数
//确保一次发送数据不超过U2_MAX_SEND_LEN字节
void U1_send(char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
vsprintf((char*)U1_TX_BUF,fmt,ap);
va_end(ap);
while(DMA1_Channel4->CNDTR!=0); //等待通道4传输完成
UART_DMA_Enable(DMA1_Channel4,strlen((const char*)U1_TX_BUF)); //通过dma发送出去
}
//定时器5中断服务程序
void TIM5_IRQHandler(void)
{
if(TIM5->SR&0X01)//是更新中断
{
U1_RX_STA|=1<<15; //标记接收完成
TIM5->SR&=~(1<<0); //清除中断标志位
TIM5_Set(0); //关闭TIM4
}
}
//设置TIM5的开关
//sta:0,关闭;1,开启;
void TIM5_Set(u8 sta)
{
if(sta)
{
TIM5->CR1|=1<<0; //使能定时器5
TIM5->CNT=0; //计数器清空
}else TIM5->CR1&=~(1<<0);//关闭定时器5
}
//通用定时器中断初始化
//这里始终选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
void TIM5_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<3; //TIM5时钟使能
TIM5->ARR=arr; //设定计数器自动重装值
TIM5->  SC=psc; //预分频器
TIM5->DIER|=1<<0; //允许更新中断
TIM5->CR1|=0x01; //使能定时器5
MY_NVIC_Init(1,4,TIM4_IRQn,2);//抢占2,子优先级3,组2 在2中优先级最低
}[/mw_shl_code]
理应接收到时hello 换行啊!!!!
|