stm32学习路程

这篇博客记录了作者在学习STM32微控制器过程中,关于GPIO和USART的详细学习过程。从GPIO的基本工程结构到USART的初始化配置,包括串口速率设定、数据位长度、停止位和模式选择等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stm32学习路程

前言

学习笔记,为了以后查漏补缺,记录学习进度和收获。本次学习基于奋斗stm32xV5_3寸屏幕的开发板,基于Keil V4开发环境,参考资料32位基于ARM微控制器STM32F101xx与STM32F103xx 固件函数库。

第一章 学习GPIO

1、首先明确工程文件结构

一个基本工程包括芯片底层启动驱动的汇编文件startup_stm32f10x_hd.s在ASM文件夹里(不需要修改)
一个用户文件夹一般取名USR或者APP
一个库文件夹FWlib由stm32公司提供(不需要修改)
一个CMSY文件夹,包含core_cm3.c内核源码;system_stm32f10x.c与芯片相关的系统文件(不需要修改)
一个说明文件readme


2、明确用到的库和函数

stm32f10x_rcc.都会用到,提供系统初始化,时钟设置等功能。
stm32f10x_gpio.c  I/O口操作都会用到GPIO.c


3、具体程序要点,指定GPIO的初始化,声明,赋值。

typedef struct
{
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

GPIO_InitTypeDef GPIO_InitStructure;										//声明一个结构体变量


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;		 //赋值结构体变量
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_Init(GPIOD, &GPIO_InitStructure);


第二章 学习usart

1、用到的库

stm32f10x_usart.c用于串口初始化
stm32f10x_it.c 编写串口中断函数,一般放在user
misc.c 设置中断向量


2、定义的结构体

USART_InitTypeDef串口的初始化参数

USART_InitTypeDef USART_InitStructure;声明一个结构体变量

/**赋值**/

  USART_InitStructure.USART_BaudRate = 115200; //速率115200bps
  USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位
  USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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; //收发模式


  /* Configure USART1 */
  USART_Init(USARTx, &USART_InitStructure); //调用配置串口参数函数


3、三个重要的配置函数

void RCC_Configuration(void);//时钟配置
void GPIO_Configuration(void);//I/O配置
void NVIC_Configuration(void);//中断配置

void USART_Config(USART_TypeDef* USARTx);//串口初始化配置


第四章 学习RTC

1、首先明确工程文件结构


使用到RTC(实时时钟系统)的工作要包含stm32f10x_rtc.c库文件

使用到bkp(备份寄存器)功能的得包括stm32f10x_pwr.c

RTC低功耗供电时还要使用到功耗控制(PWR),包括stm32f10x_pwr.c

还包含stm32f10x_it.c:该源文件包含了所有的中断处理程序(如果未使用中断,则所有的函数体都为空)。

2、使用到的寄存器

1、 备份寄存器(BKP) 备份寄存器由10个16位寄存器组成,可用来存储20 个字节的用户应用程序数据。他们处在备份域里,当VDD 电源被切断,他们仍然由VBAT 维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位。此外,BKP 控制寄存器用来管理侵入检测和RTC 校准功能。


2、 功耗控制(PWR)

PWR有多种用途,包括功耗管理和低功耗模式选择。

3、使用到的函数

void RTC_Configuration(void);

u32 Time_Regulate(void);

void Time_Adjust(void);
void Time_Show(void);
void Time_Display(u32 TimeVar);


3、技术掌握要点

1、rtc中断服务函数

/*******************************************************************************
* Function Name  : RTC_IRQHandler
* Description    : This function handles RTC global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_IRQHandler(void)
{
  if(RTC_GetITStatus(RTC_IT_SEC) != RESET)				 //读取秒中断状态
  {
    RTC_ClearITPendingBit(RTC_IT_SEC);					 //清除秒中断标志
    GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)));   //LED1闪烁	  

    /* 时钟更新标志置位 */
    TimeDisplay = 1;	  
    RTC_WaitForLastTask();							     //等待上一次对RTC寄存器的写操作是否已经完成    
    if(RTC_GetCounter() == 0x00015180)				     //当前时间是23:59:59时 复位为0:0:0 	    
    {
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	  PWR->CR|=1<<8;                  					 //取消备份区写保护
	  RTC_EnterConfigMode();						     //允许配置 	  				
	  RTC_WaitForLastTask();                             //等待上一次对RTC寄存器的写操作是否已经完成 
      RTC_SetCounter(0x0);								 //写入复位值
      RTC_WaitForLastTask();							 //等待上一次对RTC寄存器的写操作是否已经完成    
    }
	else if(RTC_GetCounter() > 0x00015180)				 //当再次上电后计数值超过0x00015180, 复位为当前值取模0x00015180。	    
    {
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	  PWR->CR|=1<<8;                                     //取消备份区写保护
	  RTC_EnterConfigMode();			                 //允许配置 
	  RTC_WaitForLastTask();                             //等待上一次对RTC寄存器的写操作是否已经完成    
      RTC_SetCounter(RTC_GetCounter()%0x00015180);		 //写入复位值
      RTC_WaitForLastTask();							 //等待上一次对RTC寄存器的写操作是否已经完成    
    }
  }
}

2、闹钟功能设置

3、万年历计算
4、闰年计算
5、低功耗定时唤醒CPU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值