新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2021-7-1
- 在线时间
- 2 小时
|
终于在这几天摸索出来了DMA中断发送+DMA中断接收,同时集成到一起,网上资源少,不是说DMA资源少,是集成在一起的,又是F103系列的少,倒是有F4系列的,但是移植有问题。
DMADMA中断发送+DMA中断接收顾名思义我就是 在主程序里定时发送,并且接收到一帧后给CPU中断接收,判断接收的字符符合要求用LED的亮灭来控制,因为是一帧的中断,而不是一个字节,而且中断后CPU就可以作别的事情了,大大节约了CPU资源,特别符合复杂系统的集成节约CPU资源。程序我会贴出来,给大家节约时间,这个就是从实际出发开发出来的,我马上要在项目中用,非常实用。新建了DMA_USART3的文件,算是把低中的F103芯片3个串口充分利用了。另外,我还集成了SHT30的测温模块,主程序里面我注解掉了,自己可以调出来看。
- #include "dma_usart3.h"
- #include "usart3.h"
- DMA_InitTypeDef DMA_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- void Usart_Tx_Config() //DMA的发送初始化配置
- {
- //DMA_InitTypeDef DMA_InitStructure;
- //NVIC_InitTypeDef NVIC_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
- DMA_DeInit(DMA1_Channel2); //将DMA的通道1寄存器重设为缺省值
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR; //DMA外设基地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuffer; //DMA内存基地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设
- DMA_InitStructure.DMA_BufferSize = BufferLen; //DMA通道的DMA缓存的大小
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
- DMA_Init(DMA1_Channel2, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
- USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE); //使能串口3的DMA发送 //初始化DMA Stream
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
- DMA_Cmd (DMA1_Channel2,ENABLE);
-
- }
- void Usart_Rx_Config() //DMA的接收初始化配置
- {
- //DMA_InitTypeDef DMA_InitStructure;
- //NVIC_InitTypeDef NVIC_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
- DMA_DeInit(DMA1_Channel3); //将DMA的通道1寄存器重设为缺省值
- DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR; //DMA外设基地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ReceiveBuffer; //DMA内存基地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ; //数据传输方向,从内存读取发送到外设
- DMA_InitStructure.DMA_BufferSize = BufferLen; //DMA通道的DMA缓存的大小
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
- DMA_Init(DMA1_Channel3, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
- USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE); //使能串口3的DMA发送 //初始化DMA Stream
- DMA_Cmd(DMA1_Channel3, ENABLE); //使能USART1 TX DMA1 所指示的通道
- //开启DMA传输
- }
- void Dma_Send_Enable(DMA_Channel_TypeDef*DMA_CHx,u16 ndtr)//DMA的发送使能
- {
- DMA_Cmd(DMA_CHx, DISABLE ); //关闭DMA传输
- DMA_SetCurrDataCounter(DMA_CHx,ndtr);//DMA通道的DMA缓存的大小
- DMA_Cmd(DMA_CHx, ENABLE); //开启DMA传输
- }
- void DMA1_Channel2_IRQHandler(void) //DMA的发送完成中断函数
- {
- if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!=RESET) //等待DMA2_Steam7传输完成
- {
- DMA_ClearFlag(DMA1_FLAG_TC2); //清除DMA2_Steam7传输完成标志
- DMA_Cmd(DMA1_Channel2,DISABLE); //关闭DMA
- DMA_ClearITPendingBit(DMA1_FLAG_TC2); //清除中断屏蔽位
- }
- // if(DMA_GetFlagStatus(DMA1_FLAG_TC2))
- // {
- // DMA_ClearFlag(DMA1_FLAG_TC2); //清除全部中断标志
- // }
-
-
- }
复制代码- #include "sys.h"
- #include "usart3.h"
- #include "string.h"
- #include "led.h"
- #include "dma_usart3.h"
- //////////////////////////////////////////////////////////////////////////////////
- //如果使用ucos,则包括下面的头文件即可.
- #if SYSTEM_SUPPORT_OS
- #include "includes.h" //ucos 使用
- #endif
- //////////////////////////////////////////////////////////////////////////////////
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途
- //ALIENTEK STM32开发板
- //串口1初始化
- //正点原子@ALIENTEK
- //技术论坛:www.openedv.com
- //修改日期:2012/8/18
- //版本:V1.5
- //版权所有,盗版必究。
- //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
- //All rights reserved
- //********************************************************************************
- //V1.3修改说明
- //支持适应不同频率下的串口波特率设置.
- //加入了对printf的支持
- //增加了串口接收命令功能.
- //修正了printf第一个字符丢失的bug
- //V1.4修改说明
- //1,修改串口初始化IO的bug
- //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
- //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
- //4,修改了EN_USART1_RX的使能方式
- //V1.5修改说明
- //1,增加了对UCOSII的支持
- //////////////////////////////////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////////////////
- //加入以下代码,支持printf函数,而不需要选择use MicroLIB
- #if 0
- #pragma import(__use_no_semihosting)
- //标准库需要的支持函数
- struct __FILE
- {
- int handle;
- };
- FILE __stdout;
- //定义_sys_exit()以避免使用半主机模式
- void _sys_exit(int x)
- {
- x = x;
- }
- //重定义fputc函数
- int fputc(int ch, FILE *f)
- {
- while((USART3->SR&0X40)==0);//循环发送,直到发送完毕
- USART3->DR = (u8) ch;
- return ch;
- }
- #endif
- /*使用microLib的方法*/
- /*
- int fputc(int ch, FILE *f)
- {
- USART_SendData(USART1, (uint8_t) ch);
- while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
-
- return ch;
- }
- int GetKey (void) {
- while (!(USART1->SR & USART_FLAG_RXNE));
- return ((int)(USART1->DR & 0x1FF));
- }
- */
-
- #if EN_USART3_RX //如果使能了接收
- //串口1中断服务程序
- //注意,读取USARTx->SR能避免莫名其妙的错误
- u8 USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
- //接收状态
- //bit15, 接收完成标志
- //bit14, 接收到0x0d
- //bit13~0, 接收到的有效字节数目
- u16 USART3_RX_STA=0; //接收状态标记
- u16 rx_len; //DMA接收数据的长度
- u8 ReceiveBuffer[30]; //DMA接收缓存区
- u16 BufferLen=30; //DMA缓存区的长度
- u8 i;
- void uart3_init(u32 bound)
- {
- //GPIO端口设置
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART1,GPIOA时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE );
- //USART1_TX GPIOA.9
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.9
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.9
- //USART1_RX GPIOA.10初始化
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA10
- //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//浮空输入
- GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10
- //Usart1 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
- //USART 初始化设置
- USART_InitStructure.USART_BaudRate = bound;//串口波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
- USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
- USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
- USART_Init(USART3, &USART_InitStructure); //初始化串口1
- //USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
- USART_ITConfig(USART3, USART_IT_IDLE , ENABLE); //开启串口一帧接受中断
- USART_Cmd(USART3, ENABLE); //使能串口1
-
-
- }
- void USART3_IRQHandler(void) //串口1中断服务程序
- {
- //u8 Res;
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntEnter();
- #endif
- if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) //接收中断一帧数据
- {
-
- DMA_Cmd(DMA1_Channel3, DISABLE); //关闭DMA,防止处理期间有数据
- //先读SR,再读DR,是为了清除IDLE中断
- i = USART3->SR; //读SR寄存器
- i = USART3->DR; //读DR寄存器
- rx_len = BufferLen - DMA_GetCurrDataCounter(DMA1_Channel3); //DMA_GetCurrDataCounter(DMA1_Channel3)为读取剩余字节,总长度减掉剩余就等于传输
- if(rx_len!=0) //这一帧数据长度不为0
- {
- if(ReceiveBuffer[0]==0x14)
- {
- USART3LED=!USART3LED;
- }
- }
- USART_ClearITPendingBit(USART3, USART_IT_IDLE);
- DMA_ClearFlag(DMA1_FLAG_TC3); //清除DMA2_Steam5传输完成标志
- DMA_SetCurrDataCounter(DMA1_Channel3, BufferLen); //设置DMA接收单元的长度
- DMA_Cmd(DMA1_Channel3, ENABLE); //打开DMA
-
-
-
-
- }
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntExit();
- #endif
- }
- #endif
- /*
- DMA_InitTypeDef DMA_InitStructure;
- u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度
- //DMA1的各通道配置
- //这里的传输形式是固定的,这点要根据不同的情况来修改
- //从存储器->外设模式/8位数据宽度/存储器增量模式
- //DMA_CHx:DMA通道CHx
- //cpar:外设地址
- //cmar:存储器地址
- //cndtr:数据传输量
- void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
-
- DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值
- DMA1_MEM_LEN=cndtr;
- DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设基地址
- DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设
- DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
- DMA_Init(DMA_CHx, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
-
- }
- //开启一次DMA传输
- void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
- {
- DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 TX DMA1 所指示的通道
- DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
- DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
- }
- */
复制代码- #include "led.h"
- #include "delay.h"
- #include "rs485.h"
- #include "crc8_16.h"
- #include "sys.h"
- #include "usart.h"
- #include "timer.h"
- #include "max7219.h"
- #include "myiic.h"
- #include "usart3.h"
- #include "dma_usart3.h"
- //#include "oled.h"
- //ALIENTEK战舰STM32开发板实验4
- //串口实验
- //技术支持:www.openedv.com
- //广州市星翼电子科技有限公司
-
-
- u8 SendBuffer[30]={0x01,0x02,0x03,0x04,0x05,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //DMA发送缓存区
- //数据帧接收标志
- int main(void)
- {
- // #define USART3_DMA_MAX_SEND_BUF_SIZE 12 //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.u8 SendBuff[SEND_BUF_SIZE]; //发送数据缓冲区
- // __align( 8 ) u8 USART3_DMA_send_BUF[USART3_DMA_MAX_SEND_BUF_SIZE]; /* DMA发送缓冲,最大USART3_MAX_SEND_LEN字节 */
- // #define USART3_DMA_MAX_REV_BUF_SIZE 14 //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.u8 SendBuff[SEND_BUF_SIZE]; //发送数据缓冲区
- // __align( 8 ) u8 USART3_DMA_REV_BUF[USART3_DMA_MAX_REV_BUF_SIZE]; /* DMA发送缓冲,最大USART3_MAX_SEND_LEN字节 */
- //
- u8 t;
- // u8 USART3_TX_BUF[]={0x01,0x02,0x03,0x04,0x05,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF};
- u8 Y_LED_S_STATUS = 0;
- u8 R_LED_S_STATUS = 0;
- u8 G_LED_S_STATUS = 0;
- u8 AXI_WK_S_STATUS = 0;
- u8 Y_LED_BYTE;
- u8 R_LED_BYTE;
- u8 G_LED_BYTE;
- u8 AXI_WK_BYTE;
- delay_init(); //延时函数初始化
- NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(19200); //串口初始化为9600
- uart3_init(19200); //串口初始化为9600
- LED_Init(); //LED端口初始化
- RS485_Init(9600); //初始化RS485
- TIM3_Int_Init(7199,99);//10Khz的计数频率,计数到5000为500ms 7199,99 :7200/72000000*100=0.01s=10ms
- Init_MAX7219();
- IIC_Init();
- SHT_Init();
- Usart_Tx_Config(); //DMA的发送初始化配置
- Usart_Rx_Config(); //DMA的接收初始化配置
- // u8 USART3_TX_BUF[12];
- //MYDMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)USART3_DMA_send_BUF,USART3_DMA_MAX_SEND_BUF_SIZE);//DMA1通道4,外设为串口1,存储器为SendBuff,长度SEND_BUF_SIZE.
-
- USART_TX_BUF[0]=0x00;//广播地址
- USART_TX_BUF[1]=0x01;//广播地址
- USART_TX_BUF[2]=0x01;//广播信道
- USART_TX_BUF[3]=0x45;//设备地址
- USART_TX_BUF[4]=0x00;//灯的状态
- USART_TX_BUF[5]=0x45;//终端标识
- USART_TX_BUF[6]=0x77;//机床标识
- USART_TX_BUF[7]=0x00;//
- USART_TX_BUF[8]=0x00;//
- USART_TX_BUF[9]=0x00;//
- USART_TX_BUF[10]=0x0D;//结束回车符
- USART_TX_BUF[11]=0x0A;//结束回车符
-
-
- /*
- USART3_TX_BUF[0]=0x00;//广播地址
- USART3_TX_BUF[1]=0x01;//广播地址
- USART3_TX_BUF[2]=0x01;//广播信道
- USART3_TX_BUF[3]=0x45;//设备地址
- USART3_TX_BUF[4]=0x00;//灯的状态
- USART3_TX_BUF[5]=0x45;//终端标识
- USART3_TX_BUF[6]=0x77;//机床标识
- USART3_TX_BUF[7]=0x00;//
- USART3_TX_BUF[8]=0x00;//
- USART3_TX_BUF[9]=0x00;//
- USART3_TX_BUF[10]=0x0D;//结束回车符
- USART3_TX_BUF[11]=0x0A;//结束回车符
- */
- // OLED_Init(); //初始化OLED
- // OLED_ShowString(0,0, "HYATECH");
- // OLED_ShowString(0,16,"Level detection system");
- // OLED_ShowString(0,32,"AI:");
- // OLED_ShowString(63,32,"RES:");
- // OLED_ShowString(0,48,"LEVEL:");
- while(1)
- {
-
-
- //USART_TX_BUF[0]~USART_TX_BUF[2]为无线地址与信道
- //USART_TX_BUF[3]为终端编号
- //USART_TX_BUF[4]~USART_TX_BUF[9]:8765 4321各bit代表各点的DI信号
- //USART_TX_BUF[6]~USART_TX_BUF[7]为结尾回车符号0D0A
-
- /////////////////////机床LED灯信号检测/////////////////////
- if (YELLOW_LED==1)
- {
- Y_DELAY_FLAG=0;
- USART_TX_BUF[4]|=0x10; //和0000 0001或操作,将1位置1
- }
- else if(YELLOW_LED==0 & Y_DELAY_FLAG>150)
- {
-
- USART_TX_BUF[4]&=0xEF; //和1111 1110与操作,将1位置0
- }
-
- if (RED_LED==1)
- {
- LED_USART=0;
- LED_485=0;
- R_DELAY_FLAG=0;
- USART_TX_BUF[4]|=0x20; //和0000 0010或操作,将2位置1
- }
- else if(RED_LED==0 & R_DELAY_FLAG>150)
- {
- LED_USART=1;
- LED_485=1;
- USART_TX_BUF[4]&=0xDF; //和1111 1101与操作,将2位置0
- }
-
-
- if (GREE_LED==1)
- {
- G_DELAY_FLAG=0;
- USART_TX_BUF[4]|=0x40; //和0000 0100或操作,将3位置1
- }
- else if(GREE_LED==0 & G_DELAY_FLAG>150)
- {
- USART_TX_BUF[4]&=0xBF; //和1111 1011与操作,将3位置0
- }
- //AXI work running!
- if (AXI_WK==1)
- {
- AXI_DELAY_FLAG=0;
- USART_TX_BUF[4]|=0x80; //和0000 1000或操作,将4位置1
- }
- else if(AXI_WK==0 & AXI_DELAY_FLAG>150)
- {
- USART_TX_BUF[4]&=0x7F; //和1111 0111与操作,将4位置0
- }
-
-
-
-
-
-
-
- ////////对比各位的状态是否发生变化/////////////////////////////////
- Y_LED_BYTE=(USART_TX_BUF[4]&0x10)>>4;
- if(Y_LED_BYTE!=Y_LED_S_STATUS)
- {
- for(t=0;t<12;t++)
- {
- USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- }
- USART_RX_STA=0;
- Y_LED_S_STATUS=Y_LED_BYTE;
- delay_ms(300);
- }
- R_LED_BYTE=(USART_TX_BUF[4]&0x20)>>5;
- if(R_LED_BYTE!=R_LED_S_STATUS)
- {
- for(t=0;t<12;t++)
- {
- USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- }
- USART_RX_STA=0;
- R_LED_S_STATUS=R_LED_BYTE;
- delay_ms(300);
- }
- G_LED_BYTE=(USART_TX_BUF[4]&0x40)>>6;
- if(G_LED_BYTE!=G_LED_S_STATUS)
- {
- for(t=0;t<12;t++)
- {
- USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- }
- USART_RX_STA=0;
- G_LED_S_STATUS=G_LED_BYTE;
- delay_ms(300);
- }
- //AXI work running!
- AXI_WK_BYTE=(USART_TX_BUF[4]&0x80)>>7;
- if(AXI_WK_BYTE!=AXI_WK_S_STATUS)
- {
- for(t=0;t<12;t++)
- {
- USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- }
- USART_RX_STA=0;
- AXI_WK_S_STATUS=AXI_WK_BYTE;
- delay_ms(300);
- }
-
-
- ////////////////////液晶显示/////////////////////
- // delay_ms(5);
- // //OLED_ShowNum(50,48,flow_N3_gao,4,12);
- // OLED_ShowNum(50,48,A,1,12);
- // OLED_ShowNum(56,48,B,1,12);
- // OLED_ShowNum(62,48,C,1,12);
- // OLED_ShowNum(68,48,D,1,12);
- // OLED_ShowString(74,48,".");
- // OLED_ShowNum(78,48,E,1,12);
- // OLED_ShowNum(84,48,F,1,12);
- // OLED_ShowNum(90,48,G,1,12);
- // OLED_ShowNum(96,48,H,1,12);
- // //OLED_ShowNum(79,48,flow_N3_di,4,12);//显示Level
- // OLED_Refresh_Gram();
-
-
-
-
-
- /////////////////轮询方式发送机床数据////////////////////
- // if(USART_RX_STA&0x8000)
- //{
-
- //if(USART_RX_BUF[0]==0x14)
- //{
- /*
- j=sizeof(USART3_TX_BUF);
- for(i=0;i<USART3_DMA_MAX_SEND_BUF_SIZE;i++)//填充数据到SendBuff
- {
-
- USART3_DMA_send_BUF[i]=USART3_TX_BUF[i];
-
-
- }
-
-
- if (USART_TX_TIME_FLAG>=400)
- {
- for(t=0;t<12;t++)
- {
- USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
- while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- }
- */
-
- // USART_RX_STA=0;
- /*
- for(t=0;t<12;t++)
- {
- USART_SendData(USART3, USART3_TX_BUF[t]);//向串口3发送数据
- while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
- }
- */
-
- /*
- MYDMA_Enable(DMA1_Channel2);//开始一次DMA传输!
- if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET) //判断通道4传输完成
- {
- DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志
- }
-
- USART_TX_TIME_FLAG=0;
- }
- */
- if (USART_TX_TIME_FLAG>=400)
- {
-
- Dma_Send_Enable(DMA1_Channel2,30); //将接收到的数据发送到设备
-
- USART_TX_TIME_FLAG=0;
- }
- // if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!=RESET) //判断通道4传输完成
- // {
- // DMA_ClearFlag(DMA1_FLAG_TC2);//清除通道4传输完成标志
- // }
- //}
- // else USART_RX_STA=0;
-
- // }
- //RS485_Service();
- // /////////////////串口定时发送////////////////////
- // if(USART_TX_TIME_FLAG>=50)
- // {
- // for(t=0;t<12;t++)
- // {
- // USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
- // while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
- //
- // }
- // USART_TX_TIME_FLAG=0;
- // LED_USART=!LED_USART;
- // }
-
- /*
- sht30_data_process();
- unit=0;
- show_shu(SHT30_temperature);
- delay_ms(1000);
- unit=1;
- show_shu(SHT30_humidity);
- delay_ms(1000);
- */
-
-
- /*
-
- if(USART3_RX_STA&0x8000)
- {
-
- if(USART3_RX_BUF[0]==0x14)
- {
- USART3LED=!USART3LED;
- }
- USART3_RX_STA=0;
-
- }
-
- */
-
- }
- }
复制代码
|
|