上位机图像处理和嵌入式模块部署(f103 mcu之串口控制gpio)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们陆续学习了gpio输入、输出,串口输入、输出。其实有了这两个接口,就可以做产品了。因为我们可以通过发送串口命令,使得gpio输出高电平,或者是低电平。而gpio的高电平,或者低电平,连接到具体应用的话,则意味着它可能是一个信号灯,有可能是一个蜂鸣器,还可能是一个卷帘门,甚至是一个电梯。所以,gpio在实际场景中的应用,完全取决于具体的设备。

        除了输出,gpio输入也是一样,不同的gpio输入意味不同的功能。大家可以试想一下,如果是一个串口+gpio做成的模块,前面再加上一个usb转串口的wch芯片,那是不是就是游戏的手柄了呢。有gpio输入之后,串口把消息上传给pc,是不是pc拿到这个信号之后,就可以做对应功能的切换了。gpio输入越多,功能也就越丰富。

        今天正好接着学习stm32的机会,继续看下某火下面是怎么处理串口和gpio的。

1、首先看main函数

        main函数是重要的功能入口,对于mcu工程来说,一般软件不会特别多,所以看main函数是了解功能比较方便的一种方法。

int main(void)
{
  char ch;   
  
  HAL_Init();        
  SystemClock_Config();
  LED_GPIO_Config(); 
  DEBUG_USART_Config();

  Show_Message();
	
  while(1)
  {	
      ch=getchar();
      switch(ch)
      {
        case '1':
          LED1_ON;
          break;
					
        case '2':
          LED1_OFF;
		  break;
					
        default:
		  break;      
     }   
  }	
}

        main函数当中比较值得注意的就是Show_Message函数,一般都是为了提示我们,当前文件有哪些功能。接着就是获取用户的输入,如果用户输入为1,灯亮起;如果用户输入为0,那么灯熄灭。其他情况保持不变。

2、查看banner函数Show_Message

        我们在编写一些没有界面的、工具类软件的时候,一般也是会写一个类似于Show_Message这样的函数。它主要是提示用户,当前的软件有哪些功能,具体的参数应该怎么配置。学过dos的同学应该这方面影响比较深刻。

static void Show_Message(void)
{
    printf("This is a experiment of uart and gpio\r\n");
	printf("\r\n");
    printf("     1    ------   Open \r\n");
    printf("     2    ------   Close \r\n");  
}

3、串口接收中断改轮询

        另外不知道大家有没有注意到,这里接收输入的方式用了getchar,也就是说串口的接收时按照轮询的方式来进行的。既然是这样,那么串口的配置当中也要把之前的中断给关闭掉。修改后,函数应该是这样的,

void DEBUG_USART_Config(void)
{ 
  
  UartHandle.Instance          = DEBUG_USART;
  
  UartHandle.Init.BaudRate     = DEBUG_USART_BAUDRATE;
  UartHandle.Init.WordLength   = UART_WORDLENGTH_8B;
  UartHandle.Init.StopBits     = UART_STOPBITS_1;
  UartHandle.Init.Parity       = UART_PARITY_NONE;
  UartHandle.Init.HwFlowCtl    = UART_HWCONTROL_NONE;
  UartHandle.Init.Mode         = UART_MODE_TX_RX;
  
  HAL_UART_Init(&UartHandle);
}

void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{  
  GPIO_InitTypeDef  GPIO_InitStruct;
  
  DEBUG_USART_CLK_ENABLE();
	
	DEBUG_USART_RX_GPIO_CLK_ENABLE();
  DEBUG_USART_TX_GPIO_CLK_ENABLE();
  
/**USART1 GPIO Configuration    
  PA9     ------> USART1_TX
  PA10    ------> USART1_RX 
  */
  GPIO_InitStruct.Pin = DEBUG_USART_TX_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed =  GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = DEBUG_USART_RX_PIN;
  GPIO_InitStruct.Mode=GPIO_MODE_AF_INPUT;	
  HAL_GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStruct); 
}

4、修改LED1的配置

        前面已经描述过,这里测试使用的板子,是比较便宜的stm32f103c8t6核心板,但是LED1的pin配置和某火给出的代码不一致,所以这部分一定要修改下pin的位置,

#define LED1_PIN                  GPIO_PIN_13                
#define LED1_GPIO_PORT            GPIOC                     
#define LED1_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOC_CLK_ENABLE()

5、测试和验证

        测试的话就比较简单了,烧录后,直接插上串口,打开mobaxterm软件,配置波特率为115200,按下复位键,就可以看到模块的打印了。输入1,确认pc13是否亮起;再次输入0,确认pc13是否熄灭。类似的实验方法,还可以是485、usb、eth网络等等,完全取决于mcu有哪些接口。

        这里只是用了单字符,就实现了串口和led的绑定。如果功能比较多,一般需要自定义一个上下文的协议,类似于55aa + cmd id + cmd content + crc + aa55这样的形式。有兴趣的同学可以在这个基础上编码测试下。

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的嵌入式stm32f103串口232通讯程序: ```c #include "stm32f10x.h" #include <stdio.h> USART_InitTypeDef USART_InitStructure; void USART1_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char ch) { while (!(USART1->SR & USART_SR_TXE)); USART1->DR = ch; } void USART1_SendString(char* str) { while (*str) { USART1_SendChar(*str); str++; } } char USART1_ReceiveChar(void) { while (!(USART1->SR & USART_SR_RXNE)); return USART1->DR; } int main(void) { USART1_Init(); char str[100]; sprintf(str, "Hello World!\n"); USART1_SendString(str); while (1) { char ch = USART1_ReceiveChar(); sprintf(str, "Received character: %c\n", ch); USART1_SendString(str); } } ``` 这个程序使用了USART1来进行串口通讯,使用了PA9和PA10引脚作为USART1的TX和RX引脚。程序中包含了USART1的初始化函数和发送和接收字符的函数。在主函数中,程序首先发送了一个字符串“Hello World!”,然后不断接收字符并将接收到的字符原样发送回去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值