中级会员
 
- 积分
- 264
- 金钱
- 264
- 注册时间
- 2013-9-5
- 在线时间
- 31 小时
|
发表于 2015-9-26 21:29:43
|
显示全部楼层
空闲中断
u16 USART3_RX_STA=0; //接收数据状态
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节.
void DMA_uart3_init(void)
{
RCC->AHBENR|=1; //使能DMA时钟
/*DMA1CHANNEL3 INIT for USART3-RXD */
DMA1_Channel3->CCR&=~(1<<4); //从外设读取数据
DMA1_Channel3->CCR&=~(1<<5); //不循环
DMA1_Channel3->CCR|=1<<7; //存储器地址增量
DMA1_Channel3->CCR|=1<<12; //优先级别中
DMA1_Channel3->CCR&=~(1<<14); //非存储器到存储器模式
DMA1_Channel3->CNDTR=USART3_MAX_RECV_LEN; //传输数据长度
DMA1_Channel3->CPAR =(u32)&(USART3->DR);//传输数据外设地址
DMA1_Channel3->CMAR =(u32)(USART3_RX_BUF);//传输数据存储器地址
DMA1_Channel3->CCR|=(1<<0); //开始DMA传输
}
u16 get_DMA1ch3_reclen(void)
{
return USART3_MAX_RECV_LEN - DMA1_Channel3->CNDTR;
}
void USART3_IRQHandler(void)
{
if(USART3->SR&(1<<4)) //空闲中断
{
USART3_RX_STA=USART3->SR;//先读SR,然后读DR才能清除IDLE
USART3_RX_STA=USART3->DR;
USART3_RX_STA=get_DMA1ch3_reclen();
USART3_RX_STA|=1<<15; //强制标记接收完成
DMA1_Channel3->CCR&=~(1<<0); //关闭DMA传输
DMA1_Channel3->CNDTR = USART3_MAX_RECV_LEN;
DMA1_Channel3->CCR|=(1<<0); //开启DMA传输
}
}
//初始化IO 串口3
//pclk1 CLK1时钟频率(Mhz)
//bound:波特率
void USART3_Init(u32 pclk1,u32 bound)
{
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRH&=0XFFFF00FF; //IO状态设置
GPIOB->CRH|=0X00008B00; //PB10输出,PB11输入
RCC->APB1ENR|=1<<18; //使能串口3时钟
RCC->APB1RSTR|=1<<18; //复位串口3
RCC->APB1RSTR&=~(1<<18);//停止复位
//波特率设置
USART3->BRR=(pclk1*1000000)/(bound);// 波特率设置
USART3->CR1|=0X200C; //1位停止,无校验位.
USART3->CR1|=1<<4; //空闲中断使能
USART3->CR3=1<<6; //使能串口3的DMA接收
MY_NVIC_Init(3,3,USART3_IRQChannel,2);//组2,优先级3,3
DMA_uart3_init();
}
/*************************主程序*******************************/
int main(void)
{
u8 t=0;
u8 n=0;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //72M主频下串口初始化为9600
USART3_Init(36,9600);
//KEY_Init(); //初始化与按键连接的硬件接口
RTC_Init();
Auto_Time_Set(); //自动设置时间为编译器时间
LCD19264_IO();
ini19264();
ClearScreen();
disptimeHEAD();
while(1)
{
if(USART3_RX_STA&0X8000) //串口3接收到一次数据了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0; //添加结束符
printf("%s",USART3_RX_BUF); //发送到串口1
USART3_RX_STA=0;
printf("%d\r\n",n);
n++;
}
}
} |
|