论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-2-25 21:17:06
|
显示全部楼层
本帖最后由 likunxue 于 2016-2-26 02:12 编辑
专为你写一个工程,工作量有点大了,
我这里有一部份 USART 串口2的发送函数,你如果有用就自已试试,不明白的地方再来问我,
大家一起学习,
#define SUA_SIZE 100u //串口接收,发送缓存区大小
vu8 RX_Buf[SUA_SIZE]; //串口接收缓存数据区
vu8 TX_Buf[SUA_SIZE]; //串口2发送缓存区
RS485_Init(36,921600); //初始化485(921.600KHZ) 放在主函数初始化中
/***************************************************************************************
函 数 名: DMA1的各通道配置
这里的传输形式是固定的,这点要根据不同的情况来修改
从存储器->外设模式/8位数据宽度/存储器增量模式
调 用: UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
参 数: DMA_CHx MA通道CHx
cpar:外设地址
cmar:存储器地址
返 回 值: 无
***************************************************************************************/
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
RCC->AHBENR |= 1<<0; //开启DMA1时钟
delay_us(5);
DMA_CHx->CPAR = cpar; //DMA1 外设地址
DMA_CHx->CMAR = cmar; //DMA1,存储器地址
DMA_CHx->CCR = 0X00000000; //复位
DMA_CHx->CCR |= 1<<4; //从存储器读
DMA_CHx->CCR |= 0<<5; //普通模式
DMA_CHx->CCR |= 0<<6; //外设地址非增量模式
DMA_CHx->CCR |= 1<<7; //存储器增量模式
DMA_CHx->CCR |= 0<<8; //外设数据宽度为8位
DMA_CHx->CCR |= 0<<10; //存储器数据宽度8位
DMA_CHx->CCR |= 1<<12; //中等优先级
DMA_CHx->CCR |= 0<<14; //非存储器到存储器模式
}
/*************************************************************************************
函 数 名:初始化IO 串口2
调 用:无
参 数:pclk1 CLK1时钟频率(Mhz)
bound:波特率
反 回 值: 无
函数编写: 李坤学
**************************************************************************************/
void RS485_Init(u32 pclk1,u32 bound)
{
float temp;
u16 i, mantissa,fraction;
for(i =0; i< SUA_SIZE; i++){RX_Buf = 0; TX_Buf = 0;}//接收缓存区
RX_BYTE = 0; //串口收到的16位参数
RX_DAT = 0; //串口接收中的低7位数据寄存器
RX_QianZhiLing = 0; //串口接收中的低位接收标志位
RX_STR = 0; //串口接收缓存区指针
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR |= 1<<2; //使能PORTA口时钟
GPIOA->CRL &= 0XFFFF00FF; //IO状态设置
GPIOA->CRL |= 0X00008B00; //IO状态设置
RCC->APB1ENR |= 1<<17; //使能串口时钟
RCC->APB1RSTR |= 1<<17; //复位串口2
RCC->APB1RSTR &= ~(1<<17); //停止复位
//波特率设置
USART2->BRR = mantissa; //波特率设置
USART2->CR1 |= 1<<13; //串口2使能(UE,USATR)
USART2->CR1 |= 1<<2; //接收使能(RE)
USART2->CR1 |= 1<<3; //发送使能(TE)
USART2->CR1 |= 1<<8; //PE中断使能
USART2->CR1 |= 1<<5; //接收缓冲区非空中断使能
USART2->CR3 = 1<<7; //使能串口2的DMA发送
//DMA1通道7,外设为串口2,存储器为TX_BUF
UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)TX_Buf); //初始化DMA
MY_NVIC_Init(0,0,USART2_IRQn,4); //抢占5,子优先级0,组4
MOTOR_TIM7_Init(); //初始化定时器7
R485_RX_BYTE = 0;
PEND_OUT = 0; //初始化失步反回钱为低电平
}
/***************************************************************************************
函 数 名: 开启一次DMA传输
调 用: UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
参 数: DMA_CHx MA通道CHx
len 需要传输的字节
返 回 值: 无
***************************************************************************************/
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
DMA_CHx->CNDTR=len; //DMA1,传输数据量
DMA_CHx->CCR|=1<<0; //开启DMA传输
}
/*************************************************************************************
函 数 名: 向主机传送双字节参数(串口中断函数调用)
调 用: TX_FASONG_Byte(u16 Dat)
参 数: Dat 需要发送的参数
反 回 值: 无
**************************************************************************************/
void TX_FASONG_Byte(u16 Dat)
{
u8 S0 = Dat;
u8 S1 = Dat >> 8;
TX_LED_ON(); //开工作指示灯
while(DMA1_Channel7->CNDTR != 0); //等待通道7传输完成
TX_Buf[0] = S0 & 0x7f; //发送低7位
TX_Buf[1] = ((S0 >> 7) & 0x07)|0x88; //初始化指令码
TX_Buf[2] = S1 & 0x7f; //发送低7位
TX_Buf[3] = ((S1 >> 7) & 0x07)|0x98; //结束码,并使能读取
UART_DMA_Enable(DMA1_Channel7,4); //通过DMA发送出去4个字节
}
|
|