STM32使用USART1指令控制LED灯

软件设计

1.编程要点
1)初始化配置LED灯GPIO
2)使能RX和TX引脚GPIO时钟和USART时钟
3)初始化GPIO,并将GPIO复用到USART上
4)配置USART参数
5)使能USART
6) 获取指令输入,根据指令控制RGB彩灯

bsp_usart.h文件
#ifndef __USART_H
#define	__USART_H


#include "stm32f10x.h"
#include <stdio.h>
	
//串口1-USART1
#define  DEBUG_USARTx                   USART1
#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE           115200

// USART GPIO 引脚宏定义
#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   
#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9
#define  DEBUG_USART_RX_GPIO_PORT       GPIOA
#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_IRQ                USART1_IRQn
#define  DEBUG_USART_IRQHandler         USART1_IRQHandler

void USART_Config(void);
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);

#endif /* __USART_H */
bsp_usart.c文件
#include "bsp_usart.h"

//USART初始化配置
void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	//打开串口GPIO的时钟
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	//打开串口外设时钟
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	//将USART TX的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

    //将USART RX的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	//配置串口的工作参数
	//配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	//配置帧数据字长
	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(DEBUG_USARTx, &USART_InitStructure);
	
	//使能串口
	USART_Cmd(DEBUG_USARTx, ENABLE);	    
}

//重定向c库函数printf函数,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
		/*发送一个字节数据到串口*/
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		
		/*等待发送完毕*/
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

//重定向c库函数scanf函数,重定向后可使用scanf,getchar函数
int fgetc(FILE *f)
{
		/*等待串口输入数据*/
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(DEBUG_USARTx);
}
bsp_led.h文件
#ifndef __LED_H
#define	__LED_H

#include "stm32f10x.h"

#define LED1_GPIO_PORT    	GPIOB			               
#define LED1_GPIO_CLK 	    RCC_APB2Periph_GPIOB		 
#define LED1_GPIO_PIN		GPIO_Pin_5			       

#define LED2_GPIO_PORT    	GPIOB			              
#define LED2_GPIO_CLK 	    RCC_APB2Periph_GPIOB		 
#define LED2_GPIO_PIN		GPIO_Pin_0			       


#define LED3_GPIO_PORT    	GPIOB			              
#define LED3_GPIO_CLK 	    RCC_APB2Periph_GPIOB		 
#define LED3_GPIO_PIN		GPIO_Pin_1			        

#define ON  0
#define OFF 1

#define LED1(a)	if (a)	\
					GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
					else		\
					GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)

#define LED2(a)	if (a)	\
					GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
					else		\
					GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)

#define LED3(a)	if (a)	\
					GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\
					else		\
					GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)


#define	digitalHi(p,i)		 {p->BSRR=i;}	 //输出为高电平	
#define digitalLo(p,i)		 {p->BRR=i;}	 //输出为低电平


#define LED1_OFF		   digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON			   digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)


#define LED2_OFF		   digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON			   digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)


#define LED3_OFF		   digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON			   digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)


#define LED_RED  \
					LED1_ON;\
					LED2_OFF\
					LED3_OFF


#define LED_GREEN		\
					LED1_OFF;\
					LED2_ON\
					LED3_OFF


#define LED_BLUE	\
					LED1_OFF;\
					LED2_OFF\
					LED3_ON

					
				
#define LED_YELLOW	\
					LED1_ON;\
					LED2_ON\
					LED3_OFF

#define LED_PURPLE	\
					LED1_ON;\
					LED2_OFF\
					LED3_ON


#define LED_CYAN \
					LED1_OFF;\
					LED2_ON\
					LED3_ON
					

#define LED_WHITE	\
					LED1_ON;\
					LED2_ON\
					LED3_ON
					

#define LED_RGBOFF	\
					LED1_OFF;\
					LED2_OFF\
					LED3_OFF

void LED_GPIO_Config(void);

#endif /* __LED_H */

bsp_led.c文件
#include "./led/bsp_led.h"   

void LED_GPIO_Config(void)
{		
	
		GPIO_InitTypeDef GPIO_InitStructure;

		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
	
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;	

		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		
		GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;

		GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
		
		GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;

		GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);

		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
		
		GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);	 
    
		GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}

void assert_failed(uint8_t* file, uint32_t line)
{
	LED1_ON;
}
main.c文件
#include "stm32f10x.h"
#include "./led/bsp_led.h" 
#include "./usart/bsp_usart.h" 

static void Show_Message(void);
  
int main(void)
{	
  char ch;
  
  /*初始化RGB灯*/
  LED_GPIO_Config();
  
  /*初始化USART配置模式为 115200 8-N-1*/
  USART_Config();
	
  /*打印指令输入提示信息*/
  Show_Message();
  while(1)
	{	
    /*获取字符指令*/
    ch=getchar();
    printf("接收到字符:%c\n",ch);
    
    /*根据字符指令控制RGB彩灯颜色*/
    switch(ch)
    {
      case '1':
        LED_RED;
      break;
      case '2':
        LED_GREEN;
      break;
      case '3':
        LED_BLUE;
      break;
      case '4':
        LED_YELLOW;
      break;
      case '5':
        LED_PURPLE;
      break;
      case '6':
        LED_CYAN;
      break;
      case '7':
        LED_WHITE;
      break;
      case '8':
        LED_RGBOFF;
      break;
      default:
        /*如果不是指定指令字符,打印提示信息*/
        Show_Message();
        break;      
    }   
	}	
}

static void Show_Message(void)
{
  printf("\r\n   这是一个通过串口通信指令控制RGB彩灯实验 \n");
  printf("使用 USART 参数为:%d 8-N-1 \n",DEBUG_USART_BAUDRATE);
  printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");
  printf("   指令   ------ 彩灯颜色 \n");
  printf("     1    ------    红 \n");
  printf("     2    ------    绿 \n");
  printf("     3    ------    蓝 \n");
  printf("     4    ------    黄 \n");
  printf("     5    ------    紫 \n");
  printf("     6    ------    青 \n");
  printf("     7    ------    白 \n");
  printf("     8    ------    灭 \n");  
}
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DS.小青龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值