[CW32F003系列] 【CW32F003ExPx StartKit开发板】芯源CW32F003ExPx 的上位机数据采集通信模块

[复制链接]
3933|12
 楼主| peterLaw 发表于 2024-6-16 14:47 | 显示全部楼层 |阅读模式
本人非常荣幸使用芯源的CW32F003ExPx StartKit开发板进行上位机数据采集模块的设计开发。
首先咱们先说一下方案设计:
①使用开发板PB05口采集外部按键IO数据信号,开发板PB00外接的LED0指示灯,正常通电时指示灯常亮,按下按键时按键数值为0指示灯灭,同时通过串口发给上位机电脑发送状态指示,上位机显示 PB05 button ON/OFF ,PB0 LED0 ON/OFF;               
②上位机得到信息并反馈给开发板反馈信息,将输出的LED0点灭,同时开发板上自带的LED2等进行闪烁指示

其次咱们说一下原理图,任何程序都离不开原理图,原理才核心,如果原理线路不连接,功能也无法实现。
PA00、PB02为串口通讯的RX与TX外外部上位机进行通讯。
PB00、PB01接外部的2个LED,分别为外部LED0与外部LED1进行串口收发的状态显示。
按键以及板载LED2使用开发板上自带的进行功能试验。
上位机就用电脑以及串口通讯助手进行收发操作,指示,主要是验证通信的正确以及稳定性。
原理图指示图如下:
原理图1.png
原理图2.png
实物接线图如下:

123.png

下面咱们放一下咱们实物展示过程:


最后咱们把程序的主要循环源码放在下面,其中按键IO的状态只读取一次,与上一次状态进行判断,发生变化时才进入循环,不会重复判断导致的错误,串口发送也只是状态变化一次发送一次数据,不会一直发送,占用资源。


  1.     while(1)
  2.     {
  3.                                 //串口接收数据
  4.                                 Uart_REV[1]=USART_ReceiveData(CW_UART1);
  5.                                 if(Uart_REV[1]!= Uart_REV[0])
  6.                                 {
  7.                                        
  8.                                                 Uart_REV[0]=Uart_REV[1];//串口状态变化
  9.                                                 if(Uart_REV[1])
  10.                                                 {
  11.                                                                 GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_SET );
  12.                                                                 printf("\r\n PB0 LED0 ON \r\n");
  13.                                                                 LED2=0;
  14.                                                 }
  15.                                                 else
  16.                                                 {
  17.                                                         GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_RESET );
  18.                                                         printf("\r\n PB0 LED0 OFF \r\n");
  19.                                                         LED2=1;
  20.                                                 }
  21.                                 }
  22.                                 if(LED2)
  23.                                 {
  24.                                                 GPIO_TogglePin(CW_GPIOA, GPIO_PIN_6);
  25.                                                 Delay(0x0FFFF);                        
  26.                                 }
  27.                                 if(LED2==0)
  28.                                 {
  29.                                                 GPIO_WritePin( CW_GPIOA , GPIO_PIN_6 , GPIO_Pin_RESET );;
  30.                                                 Delay(0x0FFFF);                        
  31.                                 }
  32.                                 
  33.         //-----------------------------------------------------------------------
  34.         //以下调用函数IO口读取,每次只取一次的状态
  35.                                 Readb[0]=GPIO_ReadPin(CW_GPIOB , GPIO_PIN_5 )&0x01;
  36.         if( Readb[0]!=b[0] )
  37.         {
  38.                                                 b[0]=Readb[0];//按键1状态变化
  39.                                                                         
  40.                                                 if( Readb[0] )
  41.                                                 {        
  42.                                                                 //GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_SET );
  43.                                                                 printf("\r\n PB5 button ON \r\n");
  44.                                                                 Delay(0x7ffff);
  45.                                                                 USART_SendData(CW_UART1, 0x88);
  46.                                                                
  47.                                                 }
  48.                                                 else
  49.                                                 {
  50.                                                                 //GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_RESET );
  51.                                                                 printf("\r\n PB5 button OFF \r\n");
  52.                                                                 Delay(0x7ffff);
  53.                                                                 USART_SendData(CW_UART1, 0x89);
  54.                                                 }
  55.                                                 
  56.         }
  57.                                 Readb[1]=PB06_GETVALUE();
  58.         if( Readb[1] != b[1] )
  59.         {
  60.                                                 b[1]=Readb[1];//按键2状态变化
  61.                                                 if(Readb[1])
  62.                                                 {
  63.                                                                 PB01_SETHIGH();
  64.                                                                 printf("\r\n PB1 LED1 ON \r\n");
  65.                                                 }
  66.                                                 else
  67.                                                 {
  68.                                                                 PB01_SETLOW();
  69.                                                                 printf("\r\n PB1 LED1 OFF\r\n");
  70.                                                 }
  71.                                        
  72.         }
  73.                   
  74.     }
  75.    
  76. }
while主循环外面的就是对GPIO、UART、RCC等相关引脚配置具体如下:



  1. void RCC_Configuration(void)
  2. {
  3.   //SYSCLK = HSI = 8MHz = HCLK = PCLK
  4.   RCC_HSI_Enable(RCC_HSIOSC_DIV6);

  5.   //外设时钟使能
  6.   RCC_AHBPeriphClk_Enable(DEBUG_USART_TX_GPIO_CLK | DEBUG_USART_RX_GPIO_CLK, ENABLE);
  7.   DEBUG_USART_APBClkENx(DEBUG_USART_CLK, ENABLE);
  8. }

  9. /**
  10. * [url=home.php?mod=space&uid=247401]@brief[/url] 配置GPIO
  11. *
  12. */
  13. void GPIO_Configuration(void)
  14. {
  15.   GPIO_InitTypeDef GPIO_InitStructure;

  16.   //UART TX RX 复用
  17.   DEBUG_USART_AFTX;                     
  18.   DEBUG_USART_AFRX;                     

  19.   GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
  20.   GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  21.   GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
  22.    
  23.   GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
  24.   GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
  25.   GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  26. }

  27. /**
  28. * @brief 配置UART
  29. *
  30. */
  31. void UART_Configuration(void)
  32. {
  33.   USART_InitTypeDef USART_InitStructure;

  34.   USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate;
  35.   USART_InitStructure.USART_Over = USART_Over_16;
  36.   USART_InitStructure.USART_Source = USART_Source_PCLK;
  37.   USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq;
  38.   USART_InitStructure.USART_StartBit = USART_StartBit_FE;
  39.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  40.   USART_InitStructure.USART_Parity = USART_Parity_No ;
  41.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  42.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  43.   USART_Init(DEBUG_USARTx, &USART_InitStructure);         
  44. }

  45. /**
  46. * @brief 循环延时
  47. *
  48. * @param nCount
  49. */
  50. void Delay(__IO uint32_t nCount)
  51. {
  52.     /* Decrement nCount value */
  53.     while (nCount != 0)
  54.     {
  55.         nCount--;
  56.     }
  57. }

  58. /**
  59. * @brief Retargets the C library printf function to the USART.
  60. *
  61. */
  62. PUTCHAR_PROTOTYPE
  63. {
  64.   USART_SendData_8bit(DEBUG_USARTx, (uint8_t)ch);

  65.   while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);

  66.   return ch;
  67. }


程序源码分享给大家,进行相关设计参考,如果还有其他的问题,希望大家多多交流!


游客,如果您要查看本帖隐藏内容请回复



huquanz711 发表于 2024-6-17 08:06 来自手机 | 显示全部楼层
上位机一般就是通过串口通信来实现数据交互。
jhcj2014 发表于 2024-6-17 11:58 | 显示全部楼层
看好去还不错,板子布局还可以。
money112345 发表于 2024-6-17 14:26 | 显示全部楼层
小夏天的大西瓜 发表于 2024-6-17 22:25 | 显示全部楼层
很好的通讯采集模块
OKAKAKO 发表于 2024-6-21 21:16 | 显示全部楼层
串口通讯有更多的扩展性
中国龙芯CDX 发表于 2024-6-26 16:39 | 显示全部楼层
芯源数据IO操作如何,通讯稳定嘛?
jf101 发表于 2024-6-27 16:53 | 显示全部楼层
芯源的上位机数据采集通信模块非常不错,性价比高
AdaMaYun 发表于 2024-7-9 13:37 | 显示全部楼层
很实用的串口通讯案例,适合新手O基础搞起来
小小蚂蚁举千斤 发表于 2024-7-17 23:16 | 显示全部楼层
很不错的串口通讯教学
zhouminjie 发表于 2025-1-4 22:14 | 显示全部楼层
kerre3 发表于 2025-6-15 15:14 | 显示全部楼层
学习学习
keke 发表于 2025-6-17 13:03 | 显示全部楼层
通讯稳定不稳定?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

459

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部