stm32f407igh6学习笔记

 本文将记录我的学习历程,基于rm机甲大师实验室,主要包括各种函数的应用及相应硬件模块的介绍。阅读需要有51单片机和基本的寄存器基础。

前言:

stm32cubemx时钟树配置

12 HSE /6 x168 /2 PLLCLK /4 /2

c语言基础

一 定义结构体
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;//此声明声明了拥有四个变量的结构体,同时声明了结构体变量book,它的类型(标签)是struct Books

struct Books book2,book3[20],*book4;//用struct Books标签又声明了三个结构体变量

//也可以用typedef创建新类型
typedef struct
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} Books2;
//现在可以用Books2作为类型声明新的结构体变量
Books2 book5,book6[20],*book7;

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针(在代码中常见)
//此结构体的声明包含了其他的结构体
struct COMPLEX
{
    char string[100];
    struct Books book;
};
 
//此结构体的声明包含了指向自己类型的指针
struct NODE
{
    char string[100];
    struct NODE *next_node;
};


二 结构体变量的初始化
#include <stdio.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
 
int main()
{
    printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
}

三 访问结构成员
非指针用“.”,指针用“->”
如struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book   
book.title book.author ......
如struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} *book2 
book2->title book2->author .......
book2=&book

一 点亮LED

1 原理:三个 LED 灯的引脚为 PH10,PH11,PH12。在user label 填写命名LED_B LED_G LED_R 对应引脚输出高电平点亮。

2 代码:

点亮LED
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET);
或
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_11, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);
LED闪烁
HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_10);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_11);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_12);
HAL_Delay(500);
参数:端口、引脚 功能:对应端口的引脚电平翻转
蓝色-青色(蓝色和绿色混合)-白色(红蓝绿混合)-重灰色(红绿混合)-红色-灭
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
//读取对应引脚的电平并返回

二 flash LED

三 定时器闪烁LED

1 原理:

定时器:分配+计数+重载

(1)预分频寄存器TIMx_PSC:时钟源的信号经过TIMx_PSC按其中的分频比Prescaler进行分频(频率除以Prescaler)

(2)自动重装载寄存器 TIMx_ARR :计数器寄存器TIMx_CNT 根据时钟的频率向上计数,直到 等于TIMx_ARR的自动重装载值Counter Period,产生一个定时中断触发信号,TIMx_CNT 被清空, 并重新从 0 开始向上计数。

定时器周期=[(分频值+1)(重载值+1)]/时钟源频率

中断:当多个中断发生时,先根据抢占优先级判断哪个中断分组能够优先响应再到这个中断分组 中根据各个中断的响应优先级判断哪个中断优先响应

it.c文件中有我们配置好使能的中断类型,找到这个中断服务函数。
里面有中断回调函数,我们在主文件中对此进行重新编写。

1 HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)  
参数:*htim 定时器的句柄指针,如定时器 1 就输 入&htim1,定时器 2 就输入&htim2
作用:中断服务函数

2 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
参数:&htim1...
作用:中断回调函数。
我们可以在别处重写中断回调函数,一般我们需要在中断回调函数中判断中断来源并执行相应的用户操作。
(如定时器1啊等等 if(htim == &htim1))

3 HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) 
参数:略
HAL_StatusTypeDef是HAL 库定义的几种状态, 如果成功使定时器开始工作,则返回 HAL_OK
作用:使定时器开始工作

4 HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim) 
参数:略
作用:使对应的定时器开始工作,并使能其定时中断

定时器配置-使能定时器中断-定时器计数值满进入中断-中断内部先进入中断服务函数再进入中断回调函数

2 代码

main.c文件中:
主函数:
各种初始化(包含定时器的初始化)//此部分内容配置好了,不用自己写
HAL_TIM_Base_Start_IT(&htim1);//开启定时器1的中断模式,开始工作

中断回调函数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim == &htim1)
    {
      //500ms trigger
      bsp_led_toggle();
    }
}/*主函数开启定时器1以后,每到达时间就会进入中断服务函数中的中断回调函数。
中断回调函数在hal库的别的文件下有虚定义__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),我们需要在主文件下重写它。
进入主文件下的中断回调函数以后,首先判断是不是定时器1,再实现LED灯的翻转。*/

四. PWM 控制 LED 的亮度

1 原理:

脉冲调制有两个重要的参数:

1 输出频率,频率越高,数字信号代替模拟信号的效果越好。

2 占空比。占空比就是改变输出模拟效果的电压大小。占空比越大则模拟出的电压越大。

算法原理:

1 颜色:16进制对应4位。32位的aRGB变量每8位分别代表了 alpha(透明度)Red(红色)Green(绿色)和 Blue(蓝色)四个要素。

如纯红色表示为 0xFFFF0000(透明度位置FF,红色位置FF,其他位置0),纯绿色表示为 0xFF00FF00,纯蓝色表示为 0xFF0000FF。黄色由蓝色和绿色合成,所以可以表示为 0xFF00FFFF。

通过移位操作获得每个颜色表示的八位变量,如red = ((RGB_flow_color[i] & 0x00FF0000) >> 16)。然后将这个值作为定时器通道的比较值控制LED灯的亮度调节。

//以上这段非人话,个人认为例程的这段代码写复杂了,没必要。

2 定时器:定时器设置为PWM模式。配置定时器中的比较寄存器TIMx_CCRx,计数寄存器的值不断增加,小于比较值的时候PWM输出高电平,大于比较值的时候PWM输出低电平。

占空比 𝑃 =( 𝑇𝐼𝑀_𝐶𝐶𝑅𝑥 − 1 )/𝑇𝐼𝑀_𝐴𝑅𝑅 ∗ 100%。

3 定时器的pwm模式:

每一个定时器的pwm模式有4个通道,每一个通道都有对应标号的比较寄存器,比如定时器5的 1 号通道对应的比较寄存器为 TIM5_CCR1。

可以注意到5号定时器三个通道对应的引脚正是之前的实验中使用的 LED 引脚,所以如果对5号定时器的通道的比较值进行配置,就能够控制每一个LED引脚的电压大小,从而改变灯的亮度。

__HAL_TIM_SetCompare(&htim5, TIM_CHANNEL_1, blue);
参数:哪个定时器,哪个通道,比较的值。blue为变量,可变。
作用:通过这个函数将比较值赋值给对应定时器通道的比较寄存器   
比较寄存器的值一直在变,输出电压一直在变,灯亮度改变。

2 代码:

main.c文件中:
主函数:
//开启定时器
HAL_TIM_Base_Start(&htim5);
//开启PWM通道,分别对应三个LED灯的引脚。LED和定时器硬件都连在这一个引脚上,定时器控制的电压变化那么灯亮度就变化。
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3);
其他略
__HAL_TIM_SetCompare(&htim
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值