跑马灯实验和我为什么使用库函数? 焦点关注

2023-05-08 11:21:14 | 来源:互联网

希望读者能点赞,互动,分享,让我更有动力,等我彻底写完stm32的学习日志,我会制作成电子书,分享给大家。

我为什么使用库函数进行编写程序?

截至2020年8月28日,ST公司一共开发了三个库,分别是标准外设库(STD),HAL库,LL库,此前使用直接控制寄存器的方式控制微处理器,从开发时间上是寄存器--->标准外设库--->HAL库--->LL库,其中寄存器的优点是代码量少,标准外设库可移植性强,HAL库和LL库虽然代码量少于标准外设库和固定平台的可移植性增强,但是在跨平台的可移植性大大降低,各平台的兼容性差,并且STM32Cube平台有些臃肿,我鉴于学习时间和未来的跨平台考虑,选择了标准外设库。

下面开始正文:


(资料图)

跑马灯实验:

重要翻译:

Reset Clock Controller ——RCC寄存器(复位时钟控制器寄存器)

步骤:

确定stm32中的所需引脚的连接LED0-PB5LED1-PE5确定使用库函数头文件Stm32f10x_gpio.hStm32f10x_rcc.h源文件Stm32f10x_gpio.cStm32f10x_rcc.c一般常见库函数重要函数:1个初始化函数:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

作用:

初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器

GPIOx: GPIOA~GPIOG

这里的 GPIO_InitTypeDef* GPIO_InitStruct为:

typedef struct { uint16_t GPIO_Pin; //指定要初始化的IO口  GPIOSpeed_TypeDef GPIO_Speed; //设置IO口输出速度 GPIOMode_TypeDef GPIO_Mode; //设置工作模式:8种中的一个 }GPIO_InitTypeDef;

GPIO_Init函数初始化样例:

GPIO_InitTypeDef GPIO_InitStructure;  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 ,可高可低 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOB, &GPIO_InitStructure);         //根据设定参数初始化GPIOB.5
2个读取输入电平函数:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。

例如:

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。

例如:

GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有io口输入电平
2个读取输出电平函数:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:

GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平 uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:

GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平
4个设置输出电平函数:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为高电平(1)。实际操作BSRR寄存器

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为低电平(0)。实际操作的BRR寄存器。

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

这两个函数不常用,也是用来设置IO口输出电平。

编程

文件结构图:

文件结构图

硬件编程:

Led.h

#ifndef __LED_H #define __LED_H   //#include "sys.h" //LED 端口定义 //#define LED0 PBout(5)// DS0-digital signal 0//#define LED1 PEout(5)// DS1  void LED_Init(void);//初始化 #endif 

Led.c

#include "led.h" #include "stm32f10x.h"//初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟 //LED IO 初始化 void LED_Init(void) {     GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能 PB,PE 端口时钟     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //指定端口,LED0-->PB.5 推挽输出     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //指定模式,推挽输出     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度    GPIO_Init(GPIOB, &GPIO_InitStructure); //端口初始化    GPIO_SetBits(GPIOB,GPIO_Pin_5);         //PB.5  输出高电平       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;    //LED1-->PE.5 推挽输出     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     GPIO_Init(GPIOE, &GPIO_InitStructure);  //端口初始化    GPIO_SetBits(GPIOE,GPIO_Pin_5);   //PE.5  输出高   } 

main.c

#include "led.h" #include "delay.h" //#include "sys.h" #include "stm32f10x.h"//跑马灯实验 int main(void)  {    delay_init();                //延时函数初始化   LED_Init();               //初始化与 LED 连接的硬件接口  while(1)       {       //LED0 =0;     //LED1 =1;  //delay_ms(1000);             //延时 300ms  //LED0 =1;  //LED1 =0;  //delay_ms(300);             //延时 300ms           GPIO_SetBits(GPIOB,GPIO_Pin_5);//置高电平        GPIO_SetBits(GPIOE,GPIO_Pin_5);//同上        delay_ms(3000);          GPIO_ResetBits(GPIOB,GPIO_Pin_5);//置低电平        GPIO_ResetBits(GPIOE,GPIO_Pin_5);        delay_ms(3000);    } }  

添加头文件路径,设置obj路径,添加target文件夹和头文件,源文件

按照上面的步骤设置,就可以完成最简单的跑马灯实验。

上一篇 下一篇

相关新闻

跑马灯实验和我为什么使用库函数? 焦点关注

各方合力 “从无到有”助力公募REITs实现跨越式发展

城市英文名字大全(cs英文名字大全)|微动态

招商瑞鸿6个月持有混合A基金经理变动:王垠不再担任该基金基金经理_天天最资讯

到基层干实事 在一线长本领(干部状态新观察)

整治小区“顽疾” 消除安全隐患

重庆渝湘投建铝合金零部件制造基地二期_世界焦点

步元韵敬答云上人|今日观点

雄东片区B单元首批安置房冲出正负零 全面进入地上施工阶段

或达40℃!今年夏天会比去年更热吗?最新消息!_全球微头条

每日精选:冷冻粽子微波炉怎么加热 冷冻粽子微波炉怎么加热吃

2022重型仓库货架十大品牌排行榜_重型仓库货架哪个牌子好|环球微头条

比亚迪海鸥7.38万起,或成爆款

环球速讯:304不锈钢板厚度规格表_厚度 3mm 304不锈钢板 规格

aunt怎么读英文发音_aunt怎么读-天天微速讯

最新新闻

跑马灯实验和我为什么使用库函数? 焦点关注

各方合力 “从无到有”助力公募REITs实现跨越式发展

城市英文名字大全(cs英文名字大全)|微动态

招商瑞鸿6个月持有混合A基金经理变动:王垠不再担任该基金基金经理_天天最资讯

到基层干实事 在一线长本领(干部状态新观察)

整治小区“顽疾” 消除安全隐患

重庆渝湘投建铝合金零部件制造基地二期_世界焦点

步元韵敬答云上人|今日观点

雄东片区B单元首批安置房冲出正负零 全面进入地上施工阶段

或达40℃!今年夏天会比去年更热吗?最新消息!_全球微头条

每日精选:冷冻粽子微波炉怎么加热 冷冻粽子微波炉怎么加热吃

2022重型仓库货架十大品牌排行榜_重型仓库货架哪个牌子好|环球微头条

比亚迪海鸥7.38万起,或成爆款

环球速讯:304不锈钢板厚度规格表_厚度 3mm 304不锈钢板 规格

aunt怎么读英文发音_aunt怎么读-天天微速讯

名侦探柯南中小兰发现柯南就是工藤新一是哪几集啊_小兰哪一集知道柯南就是新一

暗黑2武学刺客加点_龙之谷刺客影加点-当前热文

给同学的毕业赠言六年级_写给同学的毕业赠言

速度与激情9下架了吗_速度与激情9 世界热门

1-3月我国锂精矿进口量98万吨 同比增长约85%

环球今头条!2023“琢璞”计划启动,无锡选派152名年轻干部“下基层”锻炼

“南京女大学生被害案”主犯洪峤被执行死刑

环球今热点:辽篮出征总决赛!大量球迷送行,郭艾伦有望复出,杨鸣盼卫冕

为了211去广西大学值吗冷门211广西大学被踢出双一流

涤纶是什么面料的_涤纶是什么面料

英国皇家骑兵队一匹马街头受惊狂奔 现场民众迅速躲避

因为怕结束而从不开始,是多数人的生活真相|环球速看料

两名中国公民在巴厘岛酒店被发现不幸身亡 中领馆回应

华为发布昇腾Ascend C编程语言;小红书筹建大模型团队;日本京瓷将于今秋推出其首款数码印花机|Do早报|世界微头条

梦到一个人意味着什么 梦里梦到一个人意味着什么