STM32 task3学习记录
Posted m0_58834905
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 task3学习记录相关的知识,希望对你有一定的参考价值。
Day3
由于视频学习太碎片化,而且容易跟不上思路,今天的学习先从读《STM32库开发实战指南》开始
- 读书随记
1.GPIO被分为GPIOA、GPIOB等不同的组
2.每个端口16个引脚,每个引脚的模式由寄存器的四位控制
3.stm32f10x.h用宏定义的方式实现了地址映射
4.GPIO_TypeDef用typedef关键字声明了GPIO_TypeDef的结构体类型,结构体内定义了七个_IO uint32_t类型的变量
5.时钟系统
1)高速外部时钟HSE
2)高速内部时钟HIS
3)低速外部时钟LSE
4)低速内部时钟LSI
二、基于固件库的LED灯
1.配置环境
需要stm32f10x_gpio.c用于控制io口,stm32f10x_rcc.c配置外设时钟,以及头文件
(取消这两个的注释)
2.初始化结构体GPIO_InitTypeDef
3.对GPIO结构体成员赋予控制参数
这样实现了对GPIO的初始化
4.开启外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
所有的GPIO都是挂载到APB2上的
开启复用时钟ADC1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
5.控制IO输出高低电平
这里要用到两个函数 GPIO_SetBits()输出高电平,GPIO_ResetBits()输出低电平。初始先调用GPIO_SetBits()函数让几个引脚输出高电平,使LED处于灭状态
6.续行符“/”
用于连接上下行代码,在/后面不能有空格、注释等一切杂物
7.写代码
[main.c]
#include "stm32f10x.h"
#include "bsp_led.h"
void Delay(__IO u32 nCount);
int main(void)
{
/*LED端口初始化*/
LED_GPIO_Config();
while(1)
{
LED1(ON); // 亮
Delay(0x0FFFEF);
LED1(OFF); // 灭
LED2(ON); // 亮
Delay(0x0FFFEF);
LED2(OFF); // 灭
LED3(ON); // 亮
Delay(0x0FFFEF);
LED3(OFF); // 灭
}
}
void Delay(__IO u32 nCount) //简单的延时函数
{
for(; nCount !=0;nCount--);
}
[bsp_led.c]
//板级支持包
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIOC的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
/*选择要控制的GPIOC引脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
/*设置引脚模式为推挽输出*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz*/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOC*/
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*关闭所有LED*/
GPIO_SetBits(GPIOC,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
}
[bsp_led.h]
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
/**
* 定义LED的开关
* 1是关,0是开
*/
#define ON 0
#define OFF 1
//带参宏,可以像内联函数一样使用
#define LED1(a) if(a) \\
GPIO_SetBits(GPIOC,GPIO_Pin_3);\\
else \\
GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define LED2(a) if(a) \\
GPIO_SetBits(GPIOC,GPIO_Pin_4);\\
else \\
GPIO_ResetBits(GPIOC,GPIO_Pin_4)
#define LED3(a) if(a) \\
GPIO_SetBits(GPIOC,GPIO_Pin_5);\\
else \\
GPIO_ResetBits(GPIOC,GPIO_Pin_5)
void LED_GPIO_Config(void);
#endif /* __LED_H */
三、寄存器方法编写跑马灯
1.原理图
根据LED硬件图,我们知道了点亮LED0LED1分别要对PB5和PE5这两位进行操作
2.写代码
//打开GPIOB端口的时钟
*(unsigned int *)0x40021018|=((1)<<3);
//配置IO口为输出
*(unsigned int *)0x40010C0C|=((1)<<(4*0)); //【野火版】
或者
【正点原子】
要注意通过“|“”&“操作实现对位的写入,通过<<实现对位移
今日总结:今天是收获颇丰的一天,通过实际写程序串联了前段时间的积累,可谓重见光明。当然,巨大的封装量(库函数)也让我认识到了32的高山比51高太多,要移这座山需要不断地投入才可以。
今天我先看书《库开发指南》然后再看视频,效果很好,因为书可以反复读,视频里一带而过的知识无法形成记忆,书可以很好的弥补这一点。多亏于此我彻底弄明白了GPIOx和CRLCRH等寄存器的作用
今天不知什么原因,写的程序不能点亮LED,我已经重新购买野火原装的仿真器,希望新的仿真器可以成功烧录文件
以上是关于STM32 task3学习记录的主要内容,如果未能解决你的问题,请参考以下文章
STM32学习过程记录10——使用STM32CubeMonitor可视化调参
STM32学习过程记录10——使用STM32CubeMonitor可视化调参