本人非常荣幸使用芯源的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;
- }
程序源码分享给大家,进行相关设计参考,如果还有其他的问题,希望大家多多交流!
|