OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6894|回复: 7

STM32F103系列DMA中断发送+DMA中断接收 SHT30温度传感器模块

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-7-1
在线时间
2 小时
发表于 2021-7-21 11:49:01 | 显示全部楼层 |阅读模式
终于在这几天摸索出来了DMA中断发送+DMA中断接收,同时集成到一起,网上资源少,不是说DMA资源少,是集成在一起的,又是F103系列的少,倒是有F4系列的,但是移植有问题。
DMADMA中断发送+DMA中断接收顾名思义我就是 在主程序里定时发送,并且接收到一帧后给CPU中断接收,判断接收的字符符合要求用LED的亮灭来控制,因为是一帧的中断,而不是一个字节,而且中断后CPU就可以作别的事情了,大大节约了CPU资源,特别符合复杂系统的集成节约CPU资源。程序我会贴出来,给大家节约时间,这个就是从实际出发开发出来的,我马上要在项目中用,非常实用。新建了DMA_USART3的文件,算是把低中的F103芯片3个串口充分利用了。另外,我还集成了SHT30的测温模块,主程序里面我注解掉了,自己可以调出来看。
  1. #include "dma_usart3.h"                                                                                                                                                     
  2. #include "usart3.h"       

  3.         DMA_InitTypeDef  DMA_InitStructure;
  4.         NVIC_InitTypeDef NVIC_InitStructure;
  5. void Usart_Tx_Config()                                                     //DMA的发送初始化配置
  6. {
  7.         //DMA_InitTypeDef  DMA_InitStructure;
  8.         //NVIC_InitTypeDef NVIC_InitStructure;
  9.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
  10.   DMA_DeInit(DMA1_Channel2);   //将DMA的通道1寄存器重设为缺省值
  11.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;  //DMA外设基地址
  12.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuffer;  //DMA内存基地址
  13.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
  14.         DMA_InitStructure.DMA_BufferSize = BufferLen;  //DMA通道的DMA缓存的大小
  15.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
  16.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
  17.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
  18.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
  19.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常模式
  20.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
  21.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
  22.         DMA_Init(DMA1_Channel2, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
  23.         USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE); //使能串口3的DMA发送                                    //初始化DMA Stream
  24.        
  25.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);     
  26.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;  
  27.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  
  28.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
  29.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  30.         NVIC_Init(&NVIC_InitStructure);  
  31.         DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
  32.         DMA_Cmd (DMA1_Channel2,ENABLE);  
  33.        
  34. }

  35. void Usart_Rx_Config()   //DMA的接收初始化配置
  36. {
  37.         //DMA_InitTypeDef  DMA_InitStructure;
  38.         //NVIC_InitTypeDef NVIC_InitStructure;
  39.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
  40.   DMA_DeInit(DMA1_Channel3);   //将DMA的通道1寄存器重设为缺省值
  41.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;  //DMA外设基地址
  42.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ReceiveBuffer;  //DMA内存基地址
  43.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC ;  //数据传输方向,从内存读取发送到外设
  44.         DMA_InitStructure.DMA_BufferSize = BufferLen;  //DMA通道的DMA缓存的大小
  45.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
  46.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
  47.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
  48.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
  49.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常模式
  50.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
  51.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
  52.         DMA_Init(DMA1_Channel3, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
  53.         USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE); //使能串口3的DMA发送                                      //初始化DMA Stream
  54.         DMA_Cmd(DMA1_Channel3, ENABLE);  //使能USART1 TX DMA1 所指示的通道
  55.                                          //开启DMA传输                                    
  56. }



  57. void Dma_Send_Enable(DMA_Channel_TypeDef*DMA_CHx,u16 ndtr)//DMA的发送使能
  58. {
  59.         DMA_Cmd(DMA_CHx, DISABLE );  //关闭DMA传输     
  60.         DMA_SetCurrDataCounter(DMA_CHx,ndtr);//DMA通道的DMA缓存的大小
  61.         DMA_Cmd(DMA_CHx, ENABLE);  //开启DMA传输
  62. }       

  63. void DMA1_Channel2_IRQHandler(void)                                         //DMA的发送完成中断函数
  64. {
  65.   if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!=RESET)                //等待DMA2_Steam7传输完成  
  66.   {  
  67.     DMA_ClearFlag(DMA1_FLAG_TC2);                            //清除DMA2_Steam7传输完成标志
  68.     DMA_Cmd(DMA1_Channel2,DISABLE);                                         //关闭DMA           
  69.     DMA_ClearITPendingBit(DMA1_FLAG_TC2);                     //清除中断屏蔽位     
  70.   }  
  71. //        if(DMA_GetFlagStatus(DMA1_FLAG_TC2))      
  72. //       {           
  73. //            DMA_ClearFlag(DMA1_FLAG_TC2); //清除全部中断标志
  74. //        }
  75.        
  76.        
  77. }




复制代码
  1. #include "sys.h"
  2. #include "usart3.h"         
  3. #include "string.h"
  4. #include "led.h"
  5. #include "dma_usart3.h"       
  6. //////////////////////////////////////////////////////////////////////////////////          
  7. //如果使用ucos,则包括下面的头文件即可.
  8. #if SYSTEM_SUPPORT_OS
  9. #include "includes.h"                                        //ucos 使用          
  10. #endif
  11. //////////////////////////////////////////////////////////////////////////////////         
  12. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  13. //ALIENTEK STM32开发板
  14. //串口1初始化                  
  15. //正点原子@ALIENTEK
  16. //技术论坛:www.openedv.com
  17. //修改日期:2012/8/18
  18. //版本:V1.5
  19. //版权所有,盗版必究。
  20. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  21. //All rights reserved
  22. //********************************************************************************
  23. //V1.3修改说明
  24. //支持适应不同频率下的串口波特率设置.
  25. //加入了对printf的支持
  26. //增加了串口接收命令功能.
  27. //修正了printf第一个字符丢失的bug
  28. //V1.4修改说明
  29. //1,修改串口初始化IO的bug
  30. //2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
  31. //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
  32. //4,修改了EN_USART1_RX的使能方式
  33. //V1.5修改说明
  34. //1,增加了对UCOSII的支持
  35. //////////////////////////////////////////////////////////////////////////////////           


  36. //////////////////////////////////////////////////////////////////
  37. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  38. #if 0
  39. #pragma import(__use_no_semihosting)            
  40. //标准库需要的支持函数                 
  41. struct __FILE
  42. {
  43.         int handle;

  44. };

  45. FILE __stdout;      
  46. //定义_sys_exit()以避免使用半主机模式   
  47. void _sys_exit(int x)
  48. {
  49.         x = x;
  50. }
  51. //重定义fputc函数
  52. int fputc(int ch, FILE *f)
  53. {      
  54.         while((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
  55.     USART3->DR = (u8) ch;      
  56.         return ch;
  57. }
  58. #endif

  59. /*使用microLib的方法*/
  60. /*
  61. int fputc(int ch, FILE *f)
  62. {
  63.         USART_SendData(USART1, (uint8_t) ch);

  64.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}       
  65.    
  66.     return ch;
  67. }
  68. int GetKey (void)  {

  69.     while (!(USART1->SR & USART_FLAG_RXNE));

  70.     return ((int)(USART1->DR & 0x1FF));
  71. }
  72. */

  73. #if EN_USART3_RX   //如果使能了接收
  74. //串口1中断服务程序
  75. //注意,读取USARTx->SR能避免莫名其妙的错误          
  76. u8 USART3_RX_BUF[USART3_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  77. //接收状态
  78. //bit15,        接收完成标志
  79. //bit14,        接收到0x0d
  80. //bit13~0,        接收到的有效字节数目
  81. u16 USART3_RX_STA=0;       //接收状态标记          


  82. u16 rx_len;                          //DMA接收数据的长度
  83. u8 ReceiveBuffer[30];                //DMA接收缓存区
  84. u16 BufferLen=30;                       //DMA缓存区的长度
  85. u8 i;



  86. void uart3_init(u32 bound)
  87. {
  88.         //GPIO端口设置
  89.         GPIO_InitTypeDef GPIO_InitStructure;
  90.         USART_InitTypeDef USART_InitStructure;
  91.         NVIC_InitTypeDef NVIC_InitStructure;

  92.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //使能USART1,GPIOA时钟
  93.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE );

  94.         //USART1_TX   GPIOA.9
  95.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.9
  96.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  97.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  98.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.9

  99.         //USART1_RX          GPIOA.10初始化
  100.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA10
  101.         //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  102.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//浮空输入
  103.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10  

  104.         //Usart1 NVIC 配置
  105.         NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  106.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  107.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
  108.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  109.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

  110.         //USART 初始化设置

  111.         USART_InitStructure.USART_BaudRate = bound;//串口波特率
  112.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  113.         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  114.         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  115.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  116.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  117.   USART_Init(USART3, &USART_InitStructure); //初始化串口1
  118.   //USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
  119.         USART_ITConfig(USART3, USART_IT_IDLE , ENABLE); //开启串口一帧接受中断
  120.   USART_Cmd(USART3, ENABLE);                    //使能串口1
  121.           
  122.        

  123. }

  124. void USART3_IRQHandler(void)                        //串口1中断服务程序
  125. {
  126.         //u8 Res;
  127. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  128.         OSIntEnter();   
  129. #endif
  130.         if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)  //接收中断一帧数据
  131.         {  
  132.                  
  133.     DMA_Cmd(DMA1_Channel3, DISABLE);                                        //关闭DMA,防止处理期间有数据  
  134.     //先读SR,再读DR,是为了清除IDLE中断
  135.     i = USART3->SR;                                                        //读SR寄存器
  136.     i = USART3->DR;                                                        //读DR寄存器
  137.     rx_len = BufferLen - DMA_GetCurrDataCounter(DMA1_Channel3);             //DMA_GetCurrDataCounter(DMA1_Channel3)为读取剩余字节,总长度减掉剩余就等于传输
  138.     if(rx_len!=0)                                                          //这一帧数据长度不为0
  139.     {
  140.        if(ReceiveBuffer[0]==0x14)
  141.          {               
  142.          USART3LED=!USART3LED;
  143.                                  }
  144.     }          
  145.                 USART_ClearITPendingBit(USART3, USART_IT_IDLE);
  146.     DMA_ClearFlag(DMA1_FLAG_TC3); //清除DMA2_Steam5传输完成标志
  147.     DMA_SetCurrDataCounter(DMA1_Channel3, BufferLen);                       //设置DMA接收单元的长度
  148.     DMA_Cmd(DMA1_Channel3, ENABLE);                                         //打开DMA
  149.                
  150.                
  151.        

  152.                                    
  153.    }
  154. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  155.         OSIntExit();                                                                                           
  156. #endif
  157. }
  158. #endif       




  159. /*
  160. DMA_InitTypeDef DMA_InitStructure;

  161. u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度             
  162. //DMA1的各通道配置
  163. //这里的传输形式是固定的,这点要根据不同的情况来修改
  164. //从存储器->外设模式/8位数据宽度/存储器增量模式
  165. //DMA_CHx:DMA通道CHx
  166. //cpar:外设地址
  167. //cmar:存储器地址
  168. //cndtr:数据传输量
  169. void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
  170. {
  171.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //使能DMA传输
  172.        
  173.   DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值

  174.         DMA1_MEM_LEN=cndtr;
  175.         DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设基地址
  176.         DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
  177.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
  178.         DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
  179.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
  180.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
  181.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位
  182.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
  183.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常模式
  184.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
  185.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
  186.         DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
  187.                 
  188. }
  189. //开启一次DMA传输
  190. void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
  191. {
  192.         DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道      
  193.         DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小
  194.         DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道
  195. }          
  196. */
复制代码
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "rs485.h"
  4. #include "crc8_16.h"       
  5. #include "sys.h"
  6. #include "usart.h"
  7. #include "timer.h"
  8. #include "max7219.h"
  9. #include "myiic.h"
  10. #include "usart3.h"
  11. #include "dma_usart3.h"
  12. //#include "oled.h"
  13. //ALIENTEK战舰STM32开发板实验4
  14. //串口实验  
  15. //技术支持:www.openedv.com
  16. //广州市星翼电子科技有限公司
  17.                                                                                                                                                                                      
  18.                                                                                                                                                                                           

  19.         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发送缓存区


  20.                                                                                                                                                                                         //数据帧接收标志
  21. int main(void)
  22. {

  23. //  #define USART3_DMA_MAX_SEND_BUF_SIZE 12        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.u8 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区
  24. //  __align( 8 ) u8 USART3_DMA_send_BUF[USART3_DMA_MAX_SEND_BUF_SIZE];     /* DMA发送缓冲,最大USART3_MAX_SEND_LEN字节 */
  25. //         #define USART3_DMA_MAX_REV_BUF_SIZE 14        //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍.u8 SendBuff[SEND_BUF_SIZE];        //发送数据缓冲区
  26. //  __align( 8 ) u8 USART3_DMA_REV_BUF[USART3_DMA_MAX_REV_BUF_SIZE];     /* DMA发送缓冲,最大USART3_MAX_SEND_LEN字节 */
  27. //
  28. u8 t;
  29. // u8 USART3_TX_BUF[]={0x01,0x02,0x03,0x04,0x05,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF};

  30.         u8 Y_LED_S_STATUS = 0;
  31.         u8 R_LED_S_STATUS = 0;
  32.         u8 G_LED_S_STATUS = 0;
  33.         u8 AXI_WK_S_STATUS = 0;
  34.         u8 Y_LED_BYTE;
  35.         u8 R_LED_BYTE;
  36.         u8 G_LED_BYTE;
  37.         u8 AXI_WK_BYTE;
  38.         delay_init();                     //延时函数初始化          
  39.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  40.         uart_init(19200);         //串口初始化为9600
  41.         uart3_init(19200);         //串口初始化为9600
  42.         LED_Init();                             //LED端口初始化
  43.         RS485_Init(9600);        //初始化RS485         
  44.   TIM3_Int_Init(7199,99);//10Khz的计数频率,计数到5000为500ms  7199,99 :7200/72000000*100=0.01s=10ms
  45.         Init_MAX7219();
  46.         IIC_Init();
  47.         SHT_Init();
  48.          Usart_Tx_Config();                                                          //DMA的发送初始化配置
  49.   Usart_Rx_Config();                                                          //DMA的接收初始化配置
  50. //        u8 USART3_TX_BUF[12];
  51.         //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.
  52.        

  53.         USART_TX_BUF[0]=0x00;//广播地址
  54.         USART_TX_BUF[1]=0x01;//广播地址
  55.         USART_TX_BUF[2]=0x01;//广播信道
  56.         USART_TX_BUF[3]=0x45;//设备地址
  57.         USART_TX_BUF[4]=0x00;//灯的状态
  58.         USART_TX_BUF[5]=0x45;//终端标识
  59.         USART_TX_BUF[6]=0x77;//机床标识
  60.         USART_TX_BUF[7]=0x00;//
  61.         USART_TX_BUF[8]=0x00;//
  62.         USART_TX_BUF[9]=0x00;//
  63.         USART_TX_BUF[10]=0x0D;//结束回车符
  64.         USART_TX_BUF[11]=0x0A;//结束回车符
  65.        
  66.        
  67. /*       
  68.         USART3_TX_BUF[0]=0x00;//广播地址
  69.         USART3_TX_BUF[1]=0x01;//广播地址
  70.         USART3_TX_BUF[2]=0x01;//广播信道
  71.         USART3_TX_BUF[3]=0x45;//设备地址
  72.         USART3_TX_BUF[4]=0x00;//灯的状态
  73.         USART3_TX_BUF[5]=0x45;//终端标识
  74.         USART3_TX_BUF[6]=0x77;//机床标识
  75.         USART3_TX_BUF[7]=0x00;//
  76.         USART3_TX_BUF[8]=0x00;//
  77.         USART3_TX_BUF[9]=0x00;//
  78.         USART3_TX_BUF[10]=0x0D;//结束回车符
  79.         USART3_TX_BUF[11]=0x0A;//结束回车符
  80. */       
  81. //         OLED_Init();                        //初始化OLED     
  82. //          OLED_ShowString(0,0, "HYATECH");  
  83. //         OLED_ShowString(0,16,"Level detection system");
  84. //          OLED_ShowString(0,32,"AI:");  
  85. //          OLED_ShowString(63,32,"RES:");  
  86. //          OLED_ShowString(0,48,"LEVEL:");  

  87.         while(1)
  88.         {       
  89.        

  90.                
  91. //USART_TX_BUF[0]~USART_TX_BUF[2]为无线地址与信道
  92. //USART_TX_BUF[3]为终端编号
  93. //USART_TX_BUF[4]~USART_TX_BUF[9]:8765 4321各bit代表各点的DI信号

  94. //USART_TX_BUF[6]~USART_TX_BUF[7]为结尾回车符号0D0A       
  95.                
  96. /////////////////////机床LED灯信号检测/////////////////////
  97.                    if (YELLOW_LED==1)
  98.                           {

  99.                                         Y_DELAY_FLAG=0;               
  100.           USART_TX_BUF[4]|=0x10;        //和0000 0001或操作,将1位置1                                                                                                                                                               
  101.         }
  102.                                 else if(YELLOW_LED==0 & Y_DELAY_FLAG>150)
  103.                                 {       
  104.                        
  105.                                   USART_TX_BUF[4]&=0xEF;                //和1111 1110与操作,将1位置0                                                                                                                                  
  106.         }
  107.                                
  108.                                         if (RED_LED==1)
  109.                           {                       
  110.                                         LED_USART=0;
  111.                                         LED_485=0;
  112.                                         R_DELAY_FLAG=0;
  113.           USART_TX_BUF[4]|=0x20;        //和0000 0010或操作,将2位置1                                                                                                                                                                       
  114.         }
  115.                                 else if(RED_LED==0 & R_DELAY_FLAG>150)
  116.                                 {       
  117.                                         LED_USART=1;
  118.                                         LED_485=1;
  119.                                   USART_TX_BUF[4]&=0xDF;                //和1111 1101与操作,将2位置0                                                                                                                                  
  120.         }
  121.                                
  122.                                
  123.                                         if (GREE_LED==1)
  124.                           {               
  125.           G_DELAY_FLAG=0;                                       
  126.           USART_TX_BUF[4]|=0x40;        //和0000 0100或操作,将3位置1                                                                                                                                                                       
  127.         }
  128.                                 else if(GREE_LED==0 & G_DELAY_FLAG>150)
  129.                                 {                               
  130.                                   USART_TX_BUF[4]&=0xBF;                //和1111 1011与操作,将3位置0                                                                                                                                  
  131.         }
  132. //AXI work running!
  133.                                 if (AXI_WK==1)
  134.                           {               
  135.           AXI_DELAY_FLAG=0;                                       
  136.           USART_TX_BUF[4]|=0x80;        //和0000 1000或操作,将4位置1                                                                                                                                                                       
  137.         }
  138.                                 else if(AXI_WK==0 & AXI_DELAY_FLAG>150)
  139.                                 {                               
  140.                                   USART_TX_BUF[4]&=0x7F;                //和1111 0111与操作,将4位置0                                                                                                                                  
  141.         }
  142.                                
  143.                                
  144.                                
  145.                                
  146.                                
  147.                                
  148.                                
  149. ////////对比各位的状态是否发生变化/////////////////////////////////
  150.                         Y_LED_BYTE=(USART_TX_BUF[4]&0x10)>>4;
  151.                         if(Y_LED_BYTE!=Y_LED_S_STATUS)
  152.               {
  153.                                                                 for(t=0;t<12;t++)
  154.                                                         {
  155.                                          USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
  156.                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  157.                                                         }
  158.                                   USART_RX_STA=0;
  159.                                                                 Y_LED_S_STATUS=Y_LED_BYTE;       
  160.                                                                 delay_ms(300);
  161.          }       
  162.                         R_LED_BYTE=(USART_TX_BUF[4]&0x20)>>5;
  163.                         if(R_LED_BYTE!=R_LED_S_STATUS)
  164.               {
  165.                                                                 for(t=0;t<12;t++)
  166.                                                         {
  167.                                          USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
  168.                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  169.                                                         }
  170.                                   USART_RX_STA=0;
  171.                                                                 R_LED_S_STATUS=R_LED_BYTE;       
  172.                                                                 delay_ms(300);
  173.          }       
  174.                         G_LED_BYTE=(USART_TX_BUF[4]&0x40)>>6;
  175.                         if(G_LED_BYTE!=G_LED_S_STATUS)
  176.               {
  177.                                                                 for(t=0;t<12;t++)
  178.                                                         {
  179.                                          USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
  180.                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  181.                                                         }
  182.                                   USART_RX_STA=0;
  183.                                                                 G_LED_S_STATUS=G_LED_BYTE;       
  184.                                                                 delay_ms(300);
  185.          }       
  186. //AXI work running!       
  187.                         AXI_WK_BYTE=(USART_TX_BUF[4]&0x80)>>7;
  188.                         if(AXI_WK_BYTE!=AXI_WK_S_STATUS)
  189.               {
  190.                                                                 for(t=0;t<12;t++)
  191.                                                         {
  192.                                          USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
  193.                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  194.                                                         }
  195.                                   USART_RX_STA=0;
  196.                                                                 AXI_WK_S_STATUS=AXI_WK_BYTE;       
  197.                                                                 delay_ms(300);
  198.          }       


  199.                                  
  200.                                  
  201. ////////////////////液晶显示/////////////////////                               
  202. //                 delay_ms(5);
  203. //                 //OLED_ShowNum(50,48,flow_N3_gao,4,12);
  204. //                                 OLED_ShowNum(50,48,A,1,12);
  205. //                                 OLED_ShowNum(56,48,B,1,12);
  206. //                                 OLED_ShowNum(62,48,C,1,12);
  207. //                                 OLED_ShowNum(68,48,D,1,12);
  208. //                 OLED_ShowString(74,48,".");
  209. //                                 OLED_ShowNum(78,48,E,1,12);
  210. //                                 OLED_ShowNum(84,48,F,1,12);
  211. //                                 OLED_ShowNum(90,48,G,1,12);
  212. //                                 OLED_ShowNum(96,48,H,1,12);
  213. //                 //OLED_ShowNum(79,48,flow_N3_di,4,12);//显示Level
  214. //           OLED_Refresh_Gram();       
  215.                                
  216.                                
  217.          
  218.                                
  219.                                
  220. /////////////////轮询方式发送机床数据////////////////////               

  221.                 //        if(USART_RX_STA&0x8000)
  222.                   //{       
  223.        
  224.           //if(USART_RX_BUF[0]==0x14)
  225.          //{       
  226.         /*                         
  227.          j=sizeof(USART3_TX_BUF);          
  228.         for(i=0;i<USART3_DMA_MAX_SEND_BUF_SIZE;i++)//填充数据到SendBuff
  229.     {
  230.        
  231.                         USART3_DMA_send_BUF[i]=USART3_TX_BUF[i];
  232.                        
  233.                             
  234.     }       
  235.                
  236.                
  237.              if (USART_TX_TIME_FLAG>=400)
  238.                                                  {                                               
  239.                                              for(t=0;t<12;t++)
  240.                    {
  241.                                          USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
  242.                                   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  243.                                 }
  244.         */                                         
  245.                                                        
  246.                                  // USART_RX_STA=0;                       

  247.                                                          /*
  248.                                                                      for(t=0;t<12;t++)
  249.                    {
  250.                                          USART_SendData(USART3, USART3_TX_BUF[t]);//向串口3发送数据
  251.                                   while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
  252.                                 }
  253.                                                          */
  254.                                                                                                                                                                 
  255.                 /*                                       
  256.                                                          MYDMA_Enable(DMA1_Channel2);//开始一次DMA传输!       
  257.                                                         if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)        //判断通道4传输完成
  258.                                 {                                                  
  259.                                                 DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志                                                               
  260.                           }
  261.                                                        
  262.                                                         USART_TX_TIME_FLAG=0;
  263.                                                 }
  264.                 */                       
  265.       if (USART_TX_TIME_FLAG>=400)
  266.                                 {       
  267.                                        
  268.                                          Dma_Send_Enable(DMA1_Channel2,30);                                   //将接收到的数据发送到设备
  269.                                          
  270.                                                                  USART_TX_TIME_FLAG=0;
  271.                                 }
  272. //                if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!=RESET)        //判断通道4传输完成
  273. //                                {                                                  
  274. //                                                DMA_ClearFlag(DMA1_FLAG_TC2);//清除通道4传输完成标志                                                               
  275. //                          }
  276.                                  //}                               
  277.                                  // else USART_RX_STA=0;

  278.                 //        }


  279. //RS485_Service();
  280. // /////////////////串口定时发送////////////////////       
  281. //                 if(USART_TX_TIME_FLAG>=50)               
  282. //                 {
  283. //                                                 for(t=0;t<12;t++)
  284. //               {
  285. //                                         USART_SendData(USART1, USART_TX_BUF[t]);//向串口1发送数据
  286. //                             while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  287. //                                        
  288. //                                 }
  289. //                                 USART_TX_TIME_FLAG=0;
  290. //                                 LED_USART=!LED_USART;
  291. //     }       
  292.                                                
  293. /*
  294.                   sht30_data_process();
  295.                         unit=0;
  296.                         show_shu(SHT30_temperature);
  297.                   delay_ms(1000);
  298.                         unit=1;
  299.                         show_shu(SHT30_humidity);
  300.             delay_ms(1000);
  301.         */
  302.        



  303.                                
  304.                 /*       
  305.                                                        
  306.                                         if(USART3_RX_STA&0x8000)
  307.                    {       
  308.        
  309.           if(USART3_RX_BUF[0]==0x14)
  310.          {               
  311.           USART3LED=!USART3LED;
  312.                                  }                               
  313.                                  USART3_RX_STA=0;

  314.                           }
  315.                                
  316.                                 */
  317.                                
  318.         }         
  319. }

复制代码




lora终端-测温-点阵-USART3-DMATXRX-20210721_2.zip

4.32 MB, 下载次数: 99

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2021-7-27
在线时间
18 小时
发表于 2021-7-28 10:57:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2021-7-27
在线时间
18 小时
发表于 2021-7-28 10:58:12 | 显示全部楼层

谢谢楼主分享!!!
回复 支持 反对

使用道具 举报

0

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2021-7-27
在线时间
18 小时
发表于 2021-7-28 10:59:59 | 显示全部楼层

谢谢楼主分享!!!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-7-7
在线时间
4 小时
发表于 2021-8-26 08:45:39 | 显示全部楼层
谢谢楼主分享,感谢,用的试试看,
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2019-4-29
在线时间
42 小时
发表于 2022-4-15 11:42:43 | 显示全部楼层
谢谢楼主
回复 支持 反对

使用道具 举报

8

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2019-7-14
在线时间
85 小时
发表于 2022-4-16 16:15:45 | 显示全部楼层
好东西。学习了
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2020-7-13
在线时间
62 小时
发表于 2022-4-17 10:25:14 | 显示全部楼层
还这种分享比那些非要回复才能看的好。好的分享必有回复!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表