也成功了。按下开发板的复位按钮,如果PB5对应的绿灯闪烁了,说明程序运行了。这样,我们就可以放心地在RT-Thread Studio下继续进行下一步的开发了。下一步我们把串口的调试加进来。在主函数的代码中找到LED1_PIN,选中。按F3功能键,目的是打开main.h文件(因为是链接文件,没法直接打开头文件),追加以下代码:
#define _USART1_COM_
#define USARTx USART1
#define USARTx_GPIO GPIOA
#define USARTx_CLK RCC_APB2_PERIPH_USART1
#define USARTx_GPIO_CLK RCC_APB2_PERIPH_GPIOA
#define USARTx_RxPin GPIO_PIN_10
#define USARTx_TxPin GPIO_PIN_9
#define USARTx_Rx_GPIO_AF GPIO_AF4_USART1
#define USARTx_Tx_GPIO_AF GPIO_AF4_USART1
#define GPIO_APBxClkCmd RCC_EnableAPB2PeriphClk
#define USART_APBxClkCmd RCC_EnableAPB2PeriphClk
void RCC_Configuration(void);
void GPIO_Configuration_USART(void);
void init(void);
在main.c中#include下面追加以下代码:
// 串口通讯用到的数据结构
USART_InitType USART_InitStructure;
在代码的最后面追加以下代码:
void init(void) {
/* System Clocks Configuration */
RCC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration_USART();
/* USARTy and USARTz configuration ------------------------------------------------------*/
USART_StructInit(&USART_InitStructure);
USART_InitStructure.BaudRate = 115200;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
/* Configure USARTx */
USART_Init(USARTx, &USART_InitStructure);
/* Enable the USARTx */
USART_Enable(USARTx, ENABLE);
}
/**
* @brief Configures the different system clocks.
*/
void RCC_Configuration(void) {
/* Enable GPIO clock */
GPIO_APBxClkCmd(USARTx_GPIO_CLK, ENABLE);
/* Enable USARTx Clock */
USART_APBxClkCmd(USARTx_CLK, ENABLE);
}
/**
* @brief Configures the different GPIO ports.
*/
void GPIO_Configuration_USART(void) {
GPIO_InitType GPIO_InitStructure;
/* Initialize GPIO_InitStructure */
GPIO_InitStruct(&GPIO_InitStructure);
/* Configure USARTx Tx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTx_TxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Alternate = USARTx_Tx_GPIO_AF;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
/* Configure USARTx Rx as alternate function push-pull and pull-up */
GPIO_InitStructure.Pin = USARTx_RxPin;
GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
GPIO_InitStructure.GPIO_Alternate = USARTx_Rx_GPIO_AF;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
}
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE* f) {
USART_SendData(USARTx, (uint8_t)ch);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET) ;
return (ch);
}
在main主函数的while(1)循环之前加入以下代码:
/* 初始化串口 */
init();
在主循环中加入以下代码:
/* 输出启动信息 */
printf("test the USART\n\r");
现在保存工程,进行编译。编译没有问题了,为了减少警告信息,把FWLB下的两个连接文件删除。编译工程,
下载
接下来,我们打开终端,用来观察开发板是否能向串口输出信息。
指定好各项参数,确定
出现Unable to open connection:Unable to configure serial port说明串口打开失败了。没关系,我们可以拔下USB电缆重新接上,然后我们就会看到:
看到“test the USART”,说明串口信息已经输出,printf的重定向没有问题。接下来,我们继续加入按键的处理。打开main.h文件,在init函数的下面加上按键处理的初始化函数的声明:
void KeyInputInit(GPIO_Module* GPIOx, uint16_t Pin);
在main.c文件的加上以下代码:
// 按键处理初始化
void KeyInputInit(GPIO_Module* GPIOx, uint16_t Pin)
{
GPIO_InitType GPIO_InitStructure;
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
GPIO_InitStruct(&GPIO_InitStructure);
/* Enable the GPIO Clock */
if (GPIOx == GPIOA)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
}
else if (GPIOx == GPIOB)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
}
else if (GPIOx == GPIOC)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
}
else
{
if (GPIOx == GPIOD)
{
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
}
}
/* Configure the GPIO pin as input floating*/
if (Pin <= GPIO_PIN_ALL)
{
GPIO_InitStructure.Pin = Pin;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);
}
}
在main函数的开头加入以下代码:
/* 初始化按键所在GPIO口模式:GPIO_Mode_Input */
KeyInputInit(GPIOA, GPIO_PIN_4);
在while循环中用以下代码代替之前那个printf语句
/* 按键按下,输出信息 */
if (GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_4) == Bit_SET) {
printf("Key is pressed.\n\r");
}
代码GPIO_ReadInputDataBit(GPIOA, GPIO_PIN_4) == Bit_SET用来判断按键是否按下,不同开发板要用不同的条件,我这里用的是Bit_SET,按键对用于GPIOA口的PIN4,可能你的开发板要重新指定正确的GPIO口和PIN管脚,要用Bit_RESET来判断,具体根据开发板调整。
编译、下载。打开终端显示,按下开发板上的复位按钮,看到PB5对应的绿色LED闪烁,此时轻按KEY1(PA4)按钮,终端显示区会出现“Key is pressed.”信息,说明按键的处理也已经OK了。
到这里,按键、LED、USART的调试就完成了。