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