打印
[CW32F003系列]

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

[复制链接]
2925|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本人非常荣幸使用芯源的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使用开发板上自带的进行功能试验。
上位机就用电脑以及串口通讯助手进行收发操作,指示,主要是验证通信的正确以及稳定性。
原理图指示图如下:


实物接线图如下:



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


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


    while(1)
    {
                                //串口接收数据
                                Uart_REV[1]=USART_ReceiveData(CW_UART1);
                                if(Uart_REV[1]!= Uart_REV[0])
                                {
                                       
                                                Uart_REV[0]=Uart_REV[1];//串口状态变化
                                                if(Uart_REV[1])
                                                {
                                                                GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_SET );
                                                                printf("\r\n PB0 LED0 ON \r\n");
                                                                LED2=0;
                                                }
                                                else
                                                {
                                                        GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_RESET );
                                                        printf("\r\n PB0 LED0 OFF \r\n");
                                                        LED2=1;
                                                }
                                }
                                if(LED2)
                                {
                                                GPIO_TogglePin(CW_GPIOA, GPIO_PIN_6);
                                                Delay(0x0FFFF);                        
                                }
                                if(LED2==0)
                                {
                                                GPIO_WritePin( CW_GPIOA , GPIO_PIN_6 , GPIO_Pin_RESET );;
                                                Delay(0x0FFFF);                        
                                }
                                
        //-----------------------------------------------------------------------
        //以下调用函数IO口读取,每次只取一次的状态
                                Readb[0]=GPIO_ReadPin(CW_GPIOB , GPIO_PIN_5 )&0x01;
        if( Readb[0]!=b[0] )
        {
                                                b[0]=Readb[0];//按键1状态变化
                                                                        
                                                if( Readb[0] )
                                                {        
                                                                //GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_SET );
                                                                printf("\r\n PB5 button ON \r\n");
                                                                Delay(0x7ffff);
                                                                USART_SendData(CW_UART1, 0x88);
                                                               
                                                }
                                                else
                                                {
                                                                //GPIO_WritePin( CW_GPIOB , GPIO_PIN_0 , GPIO_Pin_RESET );
                                                                printf("\r\n PB5 button OFF \r\n");
                                                                Delay(0x7ffff);
                                                                USART_SendData(CW_UART1, 0x89);
                                                }
                                                
        }
                                Readb[1]=PB06_GETVALUE();
        if( Readb[1] != b[1] )
        {
                                                b[1]=Readb[1];//按键2状态变化
                                                if(Readb[1])
                                                {
                                                                PB01_SETHIGH();
                                                                printf("\r\n PB1 LED1 ON \r\n");
                                                }
                                                else
                                                {
                                                                PB01_SETLOW();
                                                                printf("\r\n PB1 LED1 OFF\r\n");
                                                }
                                       
        }
                  
    }
   
}
while主循环外面的就是对GPIO、UART、RCC等相关引脚配置具体如下:



void RCC_Configuration(void)
{
  //SYSCLK = HSI = 8MHz = HCLK = PCLK
  RCC_HSI_Enable(RCC_HSIOSC_DIV6);

  //外设时钟使能
  RCC_AHBPeriphClk_Enable(DEBUG_USART_TX_GPIO_CLK | DEBUG_USART_RX_GPIO_CLK, ENABLE);
  DEBUG_USART_APBClkENx(DEBUG_USART_CLK, ENABLE);
}

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

  //UART TX RX 复用
  DEBUG_USART_AFTX;                     
  DEBUG_USART_AFRX;                     

  GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
  GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
   
  GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
  GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
  GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
}

/**
* @brief 配置UART
*
*/
void UART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;

  USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate;
  USART_InitStructure.USART_Over = USART_Over_16;
  USART_InitStructure.USART_Source = USART_Source_PCLK;
  USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq;
  USART_InitStructure.USART_StartBit = USART_StartBit_FE;
  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(DEBUG_USARTx, &USART_InitStructure);         
}

/**
* @brief 循环延时
*
* @param nCount
*/
void Delay(__IO uint32_t nCount)
{
    /* Decrement nCount value */
    while (nCount != 0)
    {
        nCount--;
    }
}

/**
* @brief Retargets the C library printf function to the USART.
*
*/
PUTCHAR_PROTOTYPE
{
  USART_SendData_8bit(DEBUG_USARTx, (uint8_t)ch);

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

  return ch;
}


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


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



使用特权

评论回复
沙发
huquanz711| | 2024-6-17 08:06 | 只看该作者
上位机一般就是通过串口通信来实现数据交互。

使用特权

评论回复
板凳
jhcj2014| | 2024-6-17 11:58 | 只看该作者
看好去还不错,板子布局还可以。

使用特权

评论回复
地板
money112345| | 2024-6-17 14:26 | 只看该作者
很好

使用特权

评论回复
5
小夏天的大西瓜| | 2024-6-17 22:25 | 只看该作者
很好的通讯采集模块

使用特权

评论回复
6
OKAKAKO| | 2024-6-21 21:16 | 只看该作者
串口通讯有更多的扩展性

使用特权

评论回复
7
中国龙芯CDX| | 2024-6-26 16:39 | 只看该作者
芯源数据IO操作如何,通讯稳定嘛?

使用特权

评论回复
8
jf101| | 2024-6-27 16:53 | 只看该作者
芯源的上位机数据采集通信模块非常不错,性价比高

使用特权

评论回复
9
AdaMaYun| | 2024-7-9 13:37 | 只看该作者
很实用的串口通讯案例,适合新手O基础搞起来

使用特权

评论回复
10
小小蚂蚁举千斤| | 2024-7-17 23:16 | 只看该作者
很不错的串口通讯教学

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

270

帖子

0

粉丝