精华内容
下载资源
问答
  • stm32串口通信点亮led灯
    千次阅读
    2022-01-19 21:02:06

    STM32中的串口控制LED灯的亮灭,分为两种方式,一种是直接发送数字0和1来控制灯的亮灭,另一种是通过发送字符串来控制。

    我所使用的开发板主控芯片是STM32F401RET6,主频84MHz,

    首先要进行串口的初始化:

    /*
    函数功能:串口的初始化
    函数名:Usart_Init
    返回值:无
    参数:u32 brr
    备注:
    USART1_TXD->PA9
    USART1_RXD->PA10
    
    */
    void Usart_Init(u32 brr)
    {
    	float div;
    	u16 div_m;
    	u16 div_f;
    	//1.打开GPIOA,USART1的时钟
    	RCC->AHB1ENR	|= (1<<0);
      RCC->APB2ENR	|= (1<<4);
    	
    	//2.把PA9配置为复用推挽输出,把PA10配置为浮空输入模式
    	GPIOA->MODER &= ~(3<<18);//清零
    	GPIOA->MODER |= (2<<18);//复用功能模式
    	GPIOA->OTYPER &= ~(1<<9);//输出推挽
    	GPIOA->OSPEEDR &= ~(3<<18);//清零
    	GPIOA->OSPEEDR |=(3<<18);//输出高速
    	
    	GPIOA->MODER &= ~(3<<20);//输入模式
    	GPIOA->MODER |= (2<<20);//复用功能
    	
    	GPIOA->PUPDR &= ~(3<<20);//无上下拉
    	
    	//3.把USART1映射复用到PA9,PA10上
    	GPIOA->AFR[1] |=(0x7<<4);//USART1映射到PA9
    	GPIOA->AFR[1] |=(0x7<<8);//USART1映射到PA10
    	
    	//4.配置串口:
    	1.打开接收器和发送器
    	USART1->CR1 |= (3<<2);
    	
    	2.禁止奇偶校验
    	USART1->CR1 &= ~(1<<10);
    	3.选择字长
    	USART1->CR1 &= ~(1<<12);
    	4.选择过采样
    	USART1->CR1 &= ~(1<<15);
    	5.配置停止位
    	USART1->CR2 &= ~(3<<12);
    	
    	6.计算波特率寄存器
    	div = 84000000.0/16/brr;
    	div_m = (int)div;
    	div_f = (div-div_m)*16+0.5f;
    	USART1->BRR |= div_f|(div_m<<4);
    	7.打开USART1模块使能
    	USART1->CR1 |= (1<<13);
    	
    }

    由于用到了printf函数,需要添加以下代码段,取消半主机状态:

    /************************printf支持函数****************************/
    #pragma import(__use_no_semihosting_swi) //取消半主机状态
    
    struct __FILE { int handle; /* Add whatever you need here */ };
    FILE __stdout;
    
    int fputc(int ch, FILE *f) {
    	while((USART1->SR &(0X01<<7))==0){};
    		USART1->DR=ch;
      return (ch);
    }
    int ferror(FILE *f) {
      /* Your implementation of ferror */
      return EOF;
    }
    
    void _ttywrch(int ch) {
      while((USART1->SR &(0X01<<7))==0);
    		USART1->DR=ch;
    }
    
    void _sys_exit(int return_code) {
    label:  goto label;  /* endless loop */
    }
    

    方式一:

    /*
    函数名:Usart_Cont1
    函数功能:串口的控制方式
    返回值:无
    形参:无
    备注:
    发送31,使LED3亮;发送30,使LED3灭;
    发送41,使LED4亮;发送40,使LED4灭;
    
    */
    
    void Usart_Cont1(void)
    {
    	u8 value[2];
    	u8 i;
    	for(i=0;i<2;i++)
    	{
    		while(!(USART1->SR & (1<<5))){};//等待数据接收完成
    		value[i]=USART1->DR;
    		
    	}
    	switch(value[0])
    	{
    		case '3':
    			if(value[1]=='1')
    			{
    				LED3_ON;
    			}
    			else if(value[1]=='0')
    			{
    				LED3_OFF;
    			}
    			break;
    		case '4':
    			if(value[1]=='1')
    			{
    				LED4_ON;
    			}
    			else if(value[1]=='0')
    			{
    				LED4_OFF;
    			}		
    			break;
    	}
    }

    方式二:

    /*
    函数名:Usart_Cont2
    函数功能:串口的控制方式
    返回值:无
    形参:无
    备注:
    发送LED3_ON,使LED3亮;发送LED3_OF,使LED3灭;
    发送LED4_ON,使LED4亮;发送LED4_OF,使LED4灭;
    
    */
    
    
    void Usart_Cont2(void)
    {
    	u8 value1[8]={0};
    	u8 i;
    	for(i=0;i<7;i++)
    	{
    		while(!(USART1->SR & (1<<5))){};//等待数据接收完成
    		value1[i]=USART1->DR;
    	}
    	value1[7]='\0';
    	if(!(strcmp((const char *)value1,"LED3_ON")))
    	{
    		LED3_ON;
    	}
    	else if(!(strcmp((const char *)value1,"LED3_OF")))
    	{
    		LED3_OFF;
    	}
    	else if(!(strcmp((const char *)value1,"LED4_ON")))
    	{
    		LED4_ON;
    	}	
    	else if(!(strcmp((const char *)value1,"LED4_OF")))
    	{
    		LED4_OFF;
    	}
    }

    调试时要注意的一些问题:

    (1)串口调试助手XCOM V2.6部分字符会乱码,需要使用低版本的串口调试助手,如XCOM V1.4

    (2)使用多条发送时,需要取消勾选“发送新行”,将间隔改为1ms,使用单条发送无此问题

    (3)STM32串口的调试需要明确芯片的主频,选择正确的波特率,否则会出现乱码

    (4)有些开发板还需要将拨码开关拨上才能进行串口调试实验,如我之前使用的主控芯片为STM32F411CEU6的智能手环开发板

    完整工程源代码:https://download.csdn.net/download/qq_44678890/76737688

    更多相关内容
  • stm32实现串口通信LED灯点亮

    千次阅读 2021-10-29 14:58:59
    stm32串口通信串口协议和RS—232标准RS232电平与TTL电平的区别USB/TTL转RS232CH340串口安装安装stm32cubemx三级目录 串口协议和RS—232标准 串口通信协议:是指规定了数据包的内容,内容包含了起始位、主体数据、...

    串口协议和RS—232标准

    串口通信协议:是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485
    RS—232标准:RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。因此,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成rs232类型,再交叉连接。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。

    RS232电平与TTL电平的区别

    TTL标准:
    TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。
    RS232标准:
    逻辑1的电平为-3~-15V,逻辑0的电平为+3~+15V,注意电平的定义反相了一次

    USB/TTL转RS232

    USB转TTLSTM32F103C8T6
    GNDG
    3V33V3
    RXDPA9
    TXDPA10

    CH340串口安装

    在这里插入图片描述
    双击安装即可,检查是否安装成功,插入USB串口后,点击设备管理器,检查端口是否有CH340
    在这里插入图片描述

    安装stm32cubemx并编写程序

    链接:STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
    傻瓜式安装,把所有的框都选上
    安装完成后,点击help,下载依赖包
    在这里插入图片描述
    下载完成后,选择自己的芯片,选择前面的复选框下载,绿色代表下载好了
    你们选择后,点击install now就行
    在这里插入图片描述
    下载完成后回到home界面。点击图中的地方,创建新项目
    在这里插入图片描述
    点击part name输入自己的芯片,以stmc8t6
    为例,之后中间出现的信息点击之后,在点击start project
    在这里插入图片描述
    点击system core,进入里面的sys,在debug那里选择serial wire
    在这里插入图片描述
    在这里插入图片描述
    接下来进行配置时钟,进入rcc,有两个时钟hse,lse,我们要用GPIO借口,这些接口在APB2里
    观察时钟架构,APB2由hse时钟控制,同时在这个界面把PLLCLK右边选上
    在这里插入图片描述
    所以我们把hse那里设置为crystal/ceramic resonator就行了
    在这里插入图片描述
    接下来就是点击相应的引脚设置输出寄存器,output哪一项,一共三个PA7
    PB9 PC15
    在这里插入图片描述
    接下来点击system core里的GPIO,点击引脚名,把输出等级改为hight
    mode不用改
    在这里插入图片描述
    点击project manager 配置好自己的路径名和项目名,然后改IDE为MDK—ARM
    在这里插入图片描述
    进入code generate界面,选择生成初始化文件.c/.h,之后在点击generate code就行了
    在这里插入图片描述
    打开刚刚生成的项目将main.c的主函数部分用下列函数代替

    SystemClock_Config();//系统时钟初始化
      MX_GPIO_Init();//gpio初始化
      while (1)
      {		
    		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);//PA7亮灯
    		HAL_Delay(500);//延时0.5s
    		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);//PA7熄灯
    		HAL_Delay(500);//延时0.5s		
    		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
    		HAL_Delay(500);//延时0.5s
    		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
    		HAL_Delay(500);//延时0.5s
    		
    		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
    		HAL_Delay(500);//延时0.5s
    		
    		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
    		HAL_Delay(500);//延时0.5s
    		
      }
    
    

    在这里插入图片描述
    在烧录运行,串口要断电置boot0为0,之后即可编译运行成功

    实现led灯的周期闪烁

    USB转TTLSTM32F103C8T6
    GNDG
    3V33V3
    RXDPA9
    TXDPA10

    进入flymcu进行烧录
    在这里插入图片描述
    效果图如下
    在这里插入图片描述

    用stm32完成USART串口通信

    打开stm32cubeMX,进入我的工程,选择芯片,开始进入
    在这里插入图片描述
    接下来选择时钟配置
    在这里插入图片描述
    设置USART2,点击MODE,选择Asynchronous
    在这里插入图片描述
    接着点击CLOCK configurstion选择HSE,PLLCLK
    在这里插入图片描述
    设置中断,在NVIC SEtting中点击Enabled
    在这里插入图片描述
    后面设置路径,只需要修改Application Structure为Basic,在Toolchain/IDE为MDK—ARM,在Code generate勾选生成项目
    在这里插入图片描述
    在这里插入图片描述
    后面生成工程打开即可
    只需要把main.c里面的程序改为下列代码

    char data[]="hello windows!\n";//发送的数据
    HAL_UART_Transmit(&huart2, (uint8_t *)data, 15, 0xffff);//发送	
    HAL_Delay(1000);//延时
    

    在这里插入图片描述
    后面进行烧录
    打开串行助手打印出hello windows
    在这里插入图片描述

    接下来进行波形观察

    对keil进行相关操作
    在这里插入图片描述
    之后打开逻辑分析仪,选择端口,设置bit,运行就可观察到波形
    在这里插入图片描述
    大约1s一个波形

    在这里插入图片描述

    总结

    通过本次实验我更加了解了stm32cubeMX的分装功能,更加了解到stm32d寄存器映射原理,最终完成了本次实验

    两个工程完整代码

    链接:https://pan.baidu.com/s/11DImWFKfnLbQDtseEeS8SA
    提取码:e8cr

    展开全文
  • STM32串口双机通信.zip

    2021-08-02 20:34:44
    基于stm32野火例程,使用两个STM32串口通信,发送数字点亮LED灯,主从机烧一个程序就可,通过按键相互点亮,比较基础。
  • 程序使用STM32-PZ6806L开发板,实现USART3与PC端串口的超级终端通信,通过超级终端,用户从PC机键盘输入按键可以控制开发板的LED等状态改变。内含Keil5环境的项目源码和HyperTerminal超级终端软件。
  • 二、使用CubeMX生成代码点亮LED灯 1.使用CubeMX生成代码 2.生成.hex文件 3. 点亮LED流水灯 4.使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形 三、STM32的USART串口通讯 1.建立项目 2.编写代码 3.结果...

    目录

    一、搭建STM32开发环境

    1.安装jdk

    2.安装STM32CubeMX

    二、使用CubeMX生成代码点亮LED灯

    1.使用CubeMX生成代码

     2.生成.hex文件

    3. 点亮LED流水灯

     4.使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形

    三、STM32的USART串口通讯 

    1.建立项目

    2.编写代码 

    3.结果显示

     4.Keil上示波器波形检验

    四、参考资料


    一、搭建STM32开发环境

    1.安装jdk

    STM32CubeMX是Java实现的,需要安装jdk环境

    jdk官网下载链接:
    Java Downloads | Oracle


    2.安装STM32CubeMX

    下载地址:
    STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
    安装过程:

    以管理员身份运行SetupSTM32CubeMX,开始安装

    按照指引进行安装,设置安装路径,注意:安装路径不能含有中文

     安装完成后,需要安装固件库,打开STM32CubeMX,选择 Help下的Magne 安装固件库

    二、使用CubeMX生成代码点亮LED灯

    1.使用CubeMX生成代码

    打开CubeMX,点击ACCESS TO MCU SELECTOR创建新项目

     在Part Number处选择芯片,我这里用的是STM32F103C8T6,所以选择的是STM32F103C8,选择芯片之后再点击Start Project


     

     点击System Core,进入里面的SYS,在debug那里选择Serial Wire

    然后配置时钟,点击上面的RCC,有两个时钟,一个是HES和LSE,我们要用是GPIO接口,而这些接口都在APB2里,所以需要点击Clock Configuralion,可以看见APB2总线的时钟由HES控制,同时在这个界面把PLLCLK选上 

    然后回到之前的Pinout&Configuration界面将HES那里设为Crystal/Ceramic Resonator

    然后设置输出寄存器,进入GPIO界面,点击相应的引脚,选择GPIO_Output ,我这里一共选了三个,分别是PA4,PB4,PC15

    依次进行设置,分别点击PA4,PB4,PC14,将其配置为下图所示 

     在Project Manager–>Project下,设置自己的项目名和路径,然后把IDE那项改为MDK-ARM

     点击Code Generate,勾选生成初始化.c/.h文件,然后点击GENERATE CODE,生成代码

     2.生成.hex文件

    进入刚才设置的路径,找到生成的项目文件,用Keil软件打开

     通过目录找到并打开main.c文件,找到主函数int main(void)那一部分,在while循环的/* USER CODE BEGIN 3 /和/ USER CODE END 3 */之间插入以下代码:(注意:如果要在STM32CubeMX生成的工程中添加代码,要在提示 /* USER CODE BEGIN* /和/* USER CODE END*/之间添加代码,这样STM32CubeMX重新生成代码时才不会将自己添加的代码删除掉。此外,注意使用CubeMX配置生成的工程中的注释最好不要随便删除掉)

    	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
    	HAL_Delay(500);//延时0.5s
    	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
    	HAL_Delay(500);//延时0.5s	
    	  
    	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);//PB4亮灯
    	HAL_Delay(500);//延时0.5s
    	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);//PB4熄灯
    	HAL_Delay(500);//延时0.5s
    		
    	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
    	HAL_Delay(500);//延时0.5s
    	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
    	HAL_Delay(500);//延时0.5s
    


     

    点击魔法棒,在Output下勾选Create HEX File 

     编译运行,生成.hex文件

    3. 点亮LED流水灯

    首先连接电路,然后烧录程序,具体过程可以参考之前的博客STM32F103寄存器方式点亮LED流水灯

     4.使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形

    在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。我这里使用此功能来观察3个GPIO端口的输出波形。

    首先进行设置,点击魔法棒,设置Target外部晶振为8MHz

     然后点击Debug,按照如下设置

     设置完成后,进入调试,选择逻辑分析仪Logic Analyer

    选择要观察的引脚,点击Setup Logic Analyzer,添加要观察的引脚,分别设置Display Type为Bit,然后关闭窗口

     点击运行,观察波形 

    三、STM32的USART串口通讯 

    1.建立项目

    具体过程可以参考之前的博客:

    ARM汇编基础:创建汇编语言的STM32工程

    特别说明:不用勾选 CORE 和 Startup

     

    2.编写代码 

     代码如下

    ;RCC寄存器地址映像             
    RCC_BASE            EQU    0x40021000 
    RCC_CR              EQU    (RCC_BASE + 0x00) 
    RCC_CFGR            EQU    (RCC_BASE + 0x04) 
    RCC_CIR             EQU    (RCC_BASE + 0x08) 
    RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C) 
    RCC_APB1RSTR        EQU    (RCC_BASE + 0x10) 
    RCC_AHBENR          EQU    (RCC_BASE + 0x14) 
    RCC_APB2ENR         EQU    (RCC_BASE + 0x18) 
    RCC_APB1ENR         EQU    (RCC_BASE + 0x1C) 
    RCC_BDCR            EQU    (RCC_BASE + 0x20) 
    RCC_CSR             EQU    (RCC_BASE + 0x24) 
                                  
    ;AFIO寄存器地址映像            
    AFIO_BASE           EQU    0x40010000 
    AFIO_EVCR           EQU    (AFIO_BASE + 0x00) 
    AFIO_MAPR           EQU    (AFIO_BASE + 0x04) 
    AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08) 
    AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C) 
    AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10) 
    AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14) 
                                                               
    ;GPIOA寄存器地址映像              
    GPIOA_BASE          EQU    0x40010800 
    GPIOA_CRL           EQU    (GPIOA_BASE + 0x00) 
    GPIOA_CRH           EQU    (GPIOA_BASE + 0x04) 
    GPIOA_IDR           EQU    (GPIOA_BASE + 0x08) 
    GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C) 
    GPIOA_BSRR          EQU    (GPIOA_BASE + 0x10) 
    GPIOA_BRR           EQU    (GPIOA_BASE + 0x14) 
    GPIOA_LCKR          EQU    (GPIOA_BASE + 0x18) 
                                                           
    ;GPIO C口控制                   
    GPIOC_BASE          EQU    0x40011000 
    GPIOC_CRL           EQU    (GPIOC_BASE + 0x00) 
    GPIOC_CRH           EQU    (GPIOC_BASE + 0x04) 
    GPIOC_IDR           EQU    (GPIOC_BASE + 0x08) 
    GPIOC_ODR           EQU    (GPIOC_BASE + 0x0C) 
    GPIOC_BSRR          EQU    (GPIOC_BASE + 0x10) 
    GPIOC_BRR           EQU    (GPIOC_BASE + 0x14) 
    GPIOC_LCKR          EQU    (GPIOC_BASE + 0x18) 
                                                               
    ;串口1控制                       
    USART1_BASE         EQU    0x40013800 
    USART1_SR           EQU    (USART1_BASE + 0x00) 
    USART1_DR           EQU    (USART1_BASE + 0x04) 
    USART1_BRR          EQU    (USART1_BASE + 0x08) 
    USART1_CR1          EQU    (USART1_BASE + 0x0c) 
    USART1_CR2          EQU    (USART1_BASE + 0x10) 
    USART1_CR3          EQU    (USART1_BASE + 0x14) 
    USART1_GTPR         EQU    (USART1_BASE + 0x18) 
                                
    ;NVIC寄存器地址                
    NVIC_BASE           EQU    0xE000E000 
    NVIC_SETEN          EQU    (NVIC_BASE + 0x0010)     
    ;SETENA寄存器阵列的起始地址 
    NVIC_IRQPRI         EQU    (NVIC_BASE + 0x0400)     
    ;中断优先级寄存器阵列的起始地址 
    NVIC_VECTTBL        EQU    (NVIC_BASE + 0x0D08)     
    ;向量表偏移寄存器的地址     
    NVIC_AIRCR          EQU    (NVIC_BASE + 0x0D0C)     
    ;应用程序中断及复位控制寄存器的地址                                                
    SETENA0             EQU    0xE000E100 
    SETENA1             EQU    0xE000E104 
                                
                                  
    ;SysTick寄存器地址            
    SysTick_BASE        EQU    0xE000E010 
    SYSTICKCSR          EQU    (SysTick_BASE + 0x00) 
    SYSTICKRVR          EQU    (SysTick_BASE + 0x04) 
                                  
    ;FLASH缓冲寄存器地址映像     
    FLASH_ACR           EQU    0x40022000 
                                 
    ;SCB_BASE           EQU    (SCS_BASE + 0x0D00) 
                                 
    MSP_TOP             EQU    0x20005000               
    ;主堆栈起始值                
    PSP_TOP             EQU    0x20004E00               
    ;进程堆栈起始值             
                                
    BitAlias_BASE       EQU    0x22000000               
    ;位带别名区起始地址         
    Flag1               EQU    0x20000200 
    b_flas              EQU    (BitAlias_BASE + (0x200*32) + (0*4))               
    ;位地址 
    b_05s               EQU    (BitAlias_BASE + (0x200*32) + (1*4))               
    ;位地址 
    DlyI                EQU    0x20000204 
    DlyJ                EQU    0x20000208 
    DlyK                EQU    0x2000020C 
    SysTim              EQU    0x20000210 
    
    
    ;常数定义 
    Bit0                EQU    0x00000001 
    Bit1                EQU    0x00000002 
    Bit2                EQU    0x00000004 
    Bit3                EQU    0x00000008 
    Bit4                EQU    0x00000010 
    Bit5                EQU    0x00000020 
    Bit6                EQU    0x00000040 
    Bit7                EQU    0x00000080 
    Bit8                EQU    0x00000100 
    Bit9                EQU    0x00000200 
    Bit10               EQU    0x00000400 
    Bit11               EQU    0x00000800 
    Bit12               EQU    0x00001000 
    Bit13               EQU    0x00002000 
    Bit14               EQU    0x00004000 
    Bit15               EQU    0x00008000 
    Bit16               EQU    0x00010000 
    Bit17               EQU    0x00020000 
    Bit18               EQU    0x00040000 
    Bit19               EQU    0x00080000 
    Bit20               EQU    0x00100000 
    Bit21               EQU    0x00200000 
    Bit22               EQU    0x00400000 
    Bit23               EQU    0x00800000 
    Bit24               EQU    0x01000000 
    Bit25               EQU    0x02000000 
    Bit26               EQU    0x04000000 
    Bit27               EQU    0x08000000 
    Bit28               EQU    0x10000000 
    Bit29               EQU    0x20000000 
    Bit30               EQU    0x40000000 
    Bit31               EQU    0x80000000 
    
    
    ;向量表 
        AREA RESET, DATA, READONLY 
        DCD    MSP_TOP            ;初始化主堆栈 
        DCD    Start              ;复位向量 
        DCD    NMI_Handler        ;NMI Handler 
        DCD    HardFault_Handler  ;Hard Fault Handler 
        DCD    0                   
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    0 
        DCD    SysTick_Handler    ;SysTick Handler 
        SPACE  20                 ;预留空间20字节 
    
    
    
    
    
    
    
    
                     
    ;代码段 
        AREA |.text|, CODE, READONLY 
        ;主程序开始 
        ENTRY                            
        ;指示程序从这里开始执行 
    Start 
        ;时钟系统设置 
        ldr    r0, =RCC_CR 
        ldr    r1, [r0] 
        orr    r1, #Bit16 
        str    r1, [r0] 
        ;开启外部晶振使能  
        ;启动外部8M晶振 
                                                
    ClkOk           
        ldr    r1, [r0] 
        ands   r1, #Bit17 
        beq    ClkOk 
        ;等待外部晶振就绪 
        ldr    r1,[r0] 
        orr    r1,#Bit17 
        str    r1,[r0] 
        ;FLASH缓冲器 
        ldr    r0, =FLASH_ACR 
        mov    r1, #0x00000032 
        str    r1, [r0] 
                
        ;设置PLL锁相环倍率为7,HSE输入不分频 
        ldr    r0, =RCC_CFGR 
        ldr    r1, [r0] 
        orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) 
        orr    r1, #Bit10 
        str    r1, [r0] 
        ;启动PLL锁相环 
        ldr    r0, =RCC_CR 
        ldr    r1, [r0] 
        orr    r1, #Bit24 
        str    r1, [r0] 
    PllOk 
        ldr    r1, [r0] 
        ands   r1, #Bit25 
        beq    PllOk 
        ;选择PLL时钟作为系统时钟 
        ldr    r0, =RCC_CFGR 
        ldr    r1, [r0] 
        orr    r1, #(Bit18 :OR: Bit19 :OR: Bit20 :OR: Bit16 :OR: Bit14) 
        orr    r1, #Bit10 
        orr    r1, #Bit1 
        str    r1, [r0] 
        ;其它RCC相关设置 
        ldr    r0, =RCC_APB2ENR 
        mov    r1, #(Bit14 :OR: Bit4 :OR: Bit2) 
        str    r1, [r0]      
    
    
        ;IO端口设置 
        ldr    r0, =GPIOC_CRL 
        ldr    r1, [r0] 
        orr    r1, #(Bit28 :OR: Bit29)          
        ;PC.7输出模式,最大速度50MHz  
        and    r1, #(~Bit30 & ~Bit31)   
        ;PC.7通用推挽输出模式 
        str    r1, [r0] 
                
        ;PA9串口0发射脚 
        ldr    r0, =GPIOA_CRH 
        ldr    r1, [r0] 
        orr    r1, #(Bit4 :OR: Bit5)          
        ;PA.9输出模式,最大速度50MHz  
        orr    r1, #Bit7 
        and    r1, #~Bit6 
        ;10:复用功能推挽输出模式 
        str    r1, [r0]    
    
    
        ldr    r0, =USART1_BRR   
        mov    r1, #0x271 
        str    r1, [r0] 
        ;配置波特率-> 115200 
                       
        ldr    r0, =USART1_CR1   
        mov    r1, #0x200c 
        str    r1, [r0] 
        ;USART模块总使能 发送与接收使能 
        ;71 02 00 00   2c 20 00 00 
                 
        ;AFIO 参数设置             
        ;Systick 参数设置 
        ldr    r0, =SYSTICKRVR           
        ;Systick装初值 
        mov    r1, #9000 
        str    r1, [r0] 
        ldr    r0, =SYSTICKCSR           
        ;设定,启动Systick 
        mov    r1, #0x03 
        str    r1, [r0] 
                
        ;NVIC                     
        ;ldr   r0, =SETENA0 
        ;mov   r1, 0x00800000 
        ;str   r1, [r0] 
        ;ldr   r0, =SETENA1 
        ;mov   r1, #0x00000100 
        ;str   r1, [r0] 
                  
        ;切换成用户级线程序模式 
        ldr    r0, =PSP_TOP                   
        ;初始化线程堆栈 
        msr    psp, r0 
        mov    r0, #3 
        msr    control, r0 
                  
        ;初始化SRAM寄存器 
        mov    r1, #0 
        ldr    r0, =Flag1 
        str    r1, [r0] 
        ldr    r0, =DlyI 
        str    r1, [r0] 
        ldr    r0, =DlyJ 
        str    r1, [r0] 
        ldr    r0, =DlyK 
        str    r1, [r0] 
        ldr    r0, =SysTim 
        str    r1, [r0] 
                   
    ;主循环            
    main            
        ldr    r0, =Flag1 
        ldr    r1, [r0] 
        tst    r1, #Bit1                 
        ;SysTick产生0.5s,置位bit 1 
        beq    main                  ;0.5s标志还没有置位       
         
        ;0.5s标志已经置位 
        ldr    r0, =b_05s                
        ;位带操作清零0.5s标志 
        mov    r1, #0 
        str    r1, [r0] 
        bl     LedFlas 
    
    
        mov    r0, #'H' 
        bl     send_a_char
    	
    	mov    r0, #'e' 
        bl     send_a_char
    	
    	mov    r0, #'l' 
        bl     send_a_char
    	
    	mov    r0, #'l' 
        bl     send_a_char
    	
    	mov    r0, #'o' 
        bl     send_a_char
    	
    	mov    r0, #' ' 
        bl     send_a_char
    	
    	mov    r0, #'w' 
        bl     send_a_char
    	
    	mov    r0, #'o' 
        bl     send_a_char
    	
    	mov    r0, #'r' 
        bl     send_a_char
    	
    	mov    r0, #'l' 
        bl     send_a_char
    	
    	mov    r0, #'d' 
        bl     send_a_char
    	
    	mov    r0, #'\n' 
        bl     send_a_char
    	
    	b      main
                
                  
                
    ;子程序 串口1发送一个字符 
    send_a_char 
        push   {r0 - r3} 
        ldr    r2, =USART1_DR   
        str    r0, [r2] 
    b1 
        ldr    r2, =USART1_SR  
        ldr    r2, [r2] 
        tst    r2, #0x40 
        beq    b1 
        ;发送完成(Transmission complete)等待 
        pop    {r0 - r3} 
        bx     lr 
    
    
                     
    ;子程序 led闪烁 
    LedFlas      
        push   {r0 - r3} 
        ldr    r0, =Flag1 
        ldr    r1, [r0] 
        tst    r1, #Bit0 
        ;bit0 闪烁标志位 
        beq    ONLED        ;为0 打开led灯 
        ;为1 关闭led灯 
        ldr    r0, =b_flas 
        mov    r1, #0 
        str    r1, [r0] 
        ;闪烁标志位置为0,下一状态为打开灯 
        ;PC.7输出0 
        ldr    r0, =GPIOC_BRR 
        ldr    r1, [r0] 
        orr    r1, #Bit7 
        str    r1, [r0] 
        b      LedEx 
    ONLED       
        ;为0 打开led灯 
        ldr    r0, =b_flas 
        mov    r1, #1 
        str    r1, [r0] 
        ;闪烁标志位置为1,下一状态为关闭灯 
        ;PC.7输出1 
        ldr    r0, =GPIOC_BSRR 
        ldr    r1, [r0] 
        orr    r1, #Bit7 
        str    r1, [r0] 
    LedEx        
        pop    {r0 - r3} 
        bx     lr 
                                    
    ;异常程序 
    NMI_Handler 
        bx     lr 
    
    
    HardFault_Handler 
        bx     lr 
                  
    SysTick_Handler 
        ldr    r0, =SysTim 
        ldr    r1, [r0] 
        add    r1, #1 
        str    r1, [r0] 
        cmp    r1, #500 
        bcc    TickExit 
        mov    r1, #0 
        str    r1, [r0] 
        ldr    r0, =b_05s  
        ;大于等于500次 清零时钟滴答计数器 设置0.5s标志位 
        ;位带操作置1 
        mov    r1, #1 
        str    r1, [r0] 
    TickExit    
        bx     lr 
                                                                               
        ALIGN            
        ;通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐 
        END
    

    仿真器设置

    勾选Create HEX File

    编译运行,生成.hex文件

    3.结果显示

    下载程序到 STM32 中,然后打开串口调试助手并没有输出Hello world,在向同学请教后发现在不拔出USB的情况下将BOOT0和BOOT1置0,点一下复位键之后,就可以输出了,结果如下

     4.Keil上示波器波形检验

     设置参数如下

    进入调试,选择Logic Analyzer,加入USART1_SR寄存器,把display type 设为bit

    点击运行,波形如下图所示,可以发现每隔一段时间电平位就会有变化,代表烧录的程序在周期性输出,与我们在串口调试助手里看到的一致。 

     

    四、参考资料

    1.搭建STM32开发环境——STM32CubeMX,Keil5

    2.基于 MDK 创建 STM32 汇编程序:串口输出 Hello world

    展开全文
  • stm32串口控制LED灯

    千次阅读 2022-04-23 21:44:29
    实验要求:电脑串口控制单片机的LED灯 led.c #include "led.h" #include "delay.h" /*初始化led所在口的时钟以及一些输入输出的相关设置*/ void Led_Init() { GPIO_InitTypeDef GPIO_Initstructure; RCC_AHB1...

    实验要求:电脑串口控制单片机的LED灯
    led.c

    #include "led.h" 
    #include "delay.h"
    /*初始化led所在口的时钟以及一些输入输出的相关设置*/
    
    void Led_Init()
    {
    	
    	GPIO_InitTypeDef GPIO_Initstructure;
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF口的时钟
    
    	GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//设置输入输出引脚
    	GPIO_Initstructure.GPIO_Mode = GPIO_Mode_OUT;//设置为输出
    	GPIO_Initstructure.GPIO_PuPd  = GPIO_PuPd_UP;//输出上拉
    	GPIO_Initstructure.GPIO_Speed  =GPIO_Fast_Speed;//输出速度为高速
    	GPIO_Initstructure.GPIO_OType  = GPIO_OType_PP;//输出模式为推挽
    	GPIO_Init(GPIOF,&GPIO_Initstructure);//GPIO的初始化
    	GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
    	
    }
    
    /*****************************************
    函数: void Led_flash()
    作用: led闪烁
    返回值:void 
    参数:void
    作者:马伟
    ********************************************/
    void Led_flash()
    {
    
    
    for(int i=0;i<5;i++)
    	{
    	
    		GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
    		delay_ms(300);
    	  GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置低,灯亮
    		delay_ms(300);
    	}
    	
    	
    }
    
    
    
    

    led.h

    #ifndef __LED_H
    #define __LED_H
    #include "sys.h"
    #define LED1 PFout(9)	  // D1
    #define LED2 PFout(10)	// D2	
    
    void Led_Init(void);//led初始化函数
    
    void Led_flash(void);//LED闪烁函数
    
    
    #endif
    
    
    

    My_usart.c

    在#include "My_usart.h"
    #include "sys.h"
    #include <stdio.h>
    //第一步GPIO的复用
    void My_usart_init(int boud_rate)
    {
    	
      GPIO_InitTypeDef GPIO_Initstructure;//GPIO初始化结构体
    	USART_InitTypeDef USART_Initstructure;//串口初始化结构体
    
    	//(1)第一步,使能串口时钟和对应GPIO口的时钟
    	//GPIOA 和 USART1 时钟使能
    
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能 GPIOA 时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE );//使能 USART1 
    	
    	// (2)设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//PA9 复用为 USART1
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10 复用为 USART1
    	
    // (3)GPIO 初始化设置:要设置模式为复用功能。
    	GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;//GPIO口A9和A10
    	GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
    	GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    	GPIO_Initstructure.GPIO_Speed = GPIO_Fast_Speed;//速度 50MHz
    	GPIO_Initstructure.GPIO_OType = GPIO_OType_PP;//推挽复用输出
    	GPIO_Init(GPIOA,&GPIO_Initstructure); //初始化 PA9,PA10
    	
    	//(4)USART 初始化设置
    	USART_Initstructure.USART_BaudRate =boud_rate;//波特率
    	USART_Initstructure.USART_WordLength = USART_WordLength_8b;//字长为八位数据格式
    	USART_Initstructure.USART_StopBits =USART_StopBits_1 ;//一个停止位
    	USART_Initstructure.USART_Parity = USART_Parity_No ;//无奇偶校验
    	USART_Initstructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx ;//接收和发送模式
    	USART_Initstructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None ;//异步不需要硬件流控制
    	USART_Init(USART1,&USART_Initstructure);//初始化串口
    	//配置中断
    //NVIC_Configuration();
    
    
    //使能串口
    USART_Cmd(USART1, ENABLE); 
    }
    void NVIC_Configuration()
    {
    	NVIC_InitTypeDef NVIC_InitStructure;//中断结构体
    	 	//Usart1 NVIC 配置
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、
    	//使能串口接收中断
     //USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    /*如果不进入中断函数,就要停止使能中断,否则进入死循环*/	
    	
    	
    }
    //发送单个字符函数
    void Usart_SendByte(USART_TypeDef *pUSART,uint8_t ch)
    {
    	 USART_SendData(USART1,ch);
    	/*这个过程是硬件自动完成的,所以我们只需要等待就可以
    	   我们给CPU这个命令之后,传输过程就自动进行了*/
    	while( USART_GetFlagStatus(pUSART,USART_FLAG_TXE)==RESET);
    	//USART_FLAG_TXE为发送寄存器空标志位,USART_FLAG_TC为发送移位寄存器标志位
    	//等于0表示没有发完,就一直等待他发完,为1表示发完
    	//USART_IT_TXE和USART_IT_TC中断标志位
    }
    
    
    
    
    /*字符串发送函数*/
    void Usart_Sendstring(USART_TypeDef *pUSART,char *str)
    {
    
    	   unsigned int i=0;
    	/* CPU 将数据帧里的每个字节按顺序转入 发送移位寄存器*/
    	do
       
    	{
    		Usart_SendByte(pUSART,*(str+i));
    			 i++; 
    	} while( *(str+i) != '\0' );
    	
    	/* 等待 发送移位寄存器  将数据帧的最后一个字节的最后一位发送出去,
    	  整个数据帧发送完毕 ,这个过程是硬件自动完成的,所以我们只需要等待就可以 */
    	  while( USART_GetFlagStatus(pUSART,USART_FLAG_TC)==RESET)
    		{}
    	
    }
    /*重构c库函数printf到串口*/
    int fputc(int ch ,FILE *f)
    {
    	
    	USART_SendData(USART1,(unsigned char) ch);
    	while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    	return (ch);
    }
    
    
    ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
    int fgetc(FILE *f)
    {
    		/* 等待串口输入数据 */
    		while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    		return (int)USART_ReceiveData(USART1);
    		
    }
    
    	
    	
    
    这里插入代码片
    

    特别注意的是printf和getchar函数的重定向

    在这里插入int fputc(int ch ,FILE *f)
    {
    	
    	USART_SendData(USART1,(unsigned char) ch);
    	while( USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    	return (ch);
    }
    
    
    ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
    int fgetc(FILE *f)
    {
    		/* 等待串口输入数据 */
    		while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    		return (int)USART_ReceiveData(USART1);
    		
    }代码片
    

    mian.c

    int  main(void)
    {
     
    	delay_init(168);		//延时初始化 
     	My_usart_init(115200);
      Led_Init();//led初始化函数
      Led_flash();//LED闪烁函数
    	show();
    	 char ch;
    while(1)
    {
    ch =getchar();
    	printf("你输入的数字是:%c",ch);
    	switch(ch)
    	{
    		  case '1':LED1=1;break;
    			case '2':LED2=0;break;
    			case '3':Led_flash();break;
    		  default :;break;
    		
    		
    	}
    }
    return 0;
    }
    
    static void show()
    {
    	
    	  printf("1: 灯1亮\n");
    		printf("2:灯2灭\n");
    		printf("3:灯闪\n");
    }
    

    实验结果

    展开全文
  • 硬件:STM32F407、中显串口屏、三色LED灯 软件:Keil、VGUS 演示地址:https://www.bilibili.com/video/BV1SB4y197AP?spm_id_from=333.999.0.0&vd_source=411816f8a66fa6ae92707ade71533def
  • STM32入门之点亮LED灯(以STM32F103为例)

    千次阅读 多人点赞 2021-11-16 14:06:49
    入门第一讲点亮LED灯(超详细)
  • STM32——串口中断接收1. 配置 GPIO 时钟、串口时钟、复用时钟2. 配置 GPIO 结构体3. 配置串口1. 2. 3. 步骤基本框架在 [5. STM32——串口发送字符、字符串 + printf 的重定向]...
  • HMI串口显示屏与单片机STM32通信,在触摸屏上可以点亮led灯,也可以在程序发送相关指令控制串口显示屏
  • STM32控制LED亮灭-HAL库

    2021-02-26 17:51:44
    使用cubemx生成 hal库 控制LED亮灭
  • STM32汇编语言点亮led灯

    千次阅读 2022-02-07 01:28:13
    STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数。即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制。 一、背景 课程的需要:微机...
  • STM32串口发送数据控制LED灯的亮灭

    千次阅读 2022-03-15 20:02:04
    #include "stm32f10x.h" #include "delay.h" #include "led.h" #include "usart.h" int main(void) { LED_Init();//初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断等级 My_usart1();//串口...
  • 文章目录QT串口通信前言一、Pycharm代码二、STM32代码 前言 前几天学了QT,只设计界面并没有用处,于是我便学习了QT的串口通信。 QT有我自己做的界面,写在博客里,可能你也用不了,我就把源码和知识点写一下 一、...
  • STM32中断实现按键LED灯闪烁、串口通信一、中断介绍1、中断处理过程2、中断优先级3、中断作用4、外部中断二、中断实例1:LED灯三、中断实例2:串口通信 一、中断介绍 中断是指计算机运行过程中,出现某些意外情况需...
  • 演示地址:https://www.bilibili.com/video/BV1wF411L7Ak?spm_id_from=333.999.0.0
  • STM32F103C8T6 点亮LED灯

    2022-06-20 14:49:05
    STM32F103C8T6 点亮LED灯,及IO口基本操作
  • 使用STM32寄存器点亮LED流水

    千次阅读 热门讨论 2021-10-18 17:54:36
    本章内容主要是完成嵌入式开发的实验: 以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
  • STM32F103点亮LED灯

    2021-10-18 22:58:00
    点亮LED灯,需要用到GPIO端口。 为了点亮LED灯,需要三个步骤: 打开GPIO口的时钟 初始化GPIO口(选择推挽输出) 设置低电平 1.打开时钟 GPIO的地址: 时钟的地址: 即0x40021018,则打开三个IO口的时钟需要将三...
  • STM32 F103之点亮LED流水一、STM32初识二、寄存器 使用工具: stm32f103C8T6 USB转串口 面包板 导线若干 LED3个 一、STM32初识 STM32,从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 ...
  • [野火]stm32用寄存器点亮LED灯

    千次阅读 2022-04-20 23:32:44
    2、寄存器点亮led灯的代码思路(一) 对GPIO的理解: GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来。 1、保护二极管及上、下拉电阻 目的:防止引脚...
  • stm32点亮三个led灯

    千次阅读 2021-10-23 14:34:27
    stm32点亮led灯stm32点灯原理建立工程文件三级目录 stm32点灯原理 通过设置相应端口的时钟,在配置相应端口寄存器,最后配置端口模式,即可点亮led灯 建立工程文件 首先我们要明白,利用stm32点灯一等要有相关的启动...
  • 本实验是为了测试STM32F407开发板和迪文DGUS串口屏通信是否正常做的一个测试程序,试验的目的是能通过触摸屏和开发板按键都能控制led 的亮灭,并且开始(key1)键和停止(key2)键按键按下后,状态反馈到触目屏的...
  • STM32串口通信详解

    千次阅读 多人点赞 2022-04-22 20:17:32
    串口通信协议,串口中断实验,用电脑端给单片机发送指令点亮LED灯
  • STM32CubeMX点亮LED

    千次阅读 2022-02-20 17:36:10
    点亮LED的步骤如下: 1、通过STM32CubeMX创建工程。 ①打开STM32CubeMX, 选择ACCESS TO MCU SELECTOR, 输入STM32F103C8, 点击Start Project。 ②点击单片机的PA1,选择GPIO_Output, RCC的HSE选择Crystal/...
  • 本文基于ST的STM32F767ZI NUCLEO144开发板,结合CubeIDE的插件CubeMX配置生成代码点亮板载的LED点亮可谓是单片机开发中的hello world,非常简单; 2 理论分析 2.1 LED 原理 发光二极管简称为LED,生活中几乎...
  • stm32CubeMX点亮一个LED灯

    千次阅读 2022-02-01 17:25:46
    本篇文章将带大家使用CubeMX配置stm32点亮一个LED灯。 一、CubeMX配置LED IO口 1.单片机型号选择: 这里我使用的是正点原子的精英版,大家可以根据自己的单片机选择相应的型号。 2.IO口及其他配置: 这里根据...
  • 此工程实现的功能是PC端串口调试助手通过STM32UART向单片机发送指令控制单片机LED亮灭。主要介绍了HAL库UART的配置。
  • stm32使用HAL库点亮一颗LED灯,主要介绍了用CubeMX工具生成新项目的过程。
  • stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。 二、工程建立 1)新建工程 首先,打开stm32...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,200
精华内容 880
关键字:

stm32串口通信点亮led灯