RT-Thread-IO
一、drv_gpio.c1.1在drv_common,c中调用rt_hw_pin_init()函数
1.2 rt_hw_pin_init()启用 STM32 微控制器中 GPIOA 外设的时钟
1.3 pins[]为每个pin定义编号
这个宏会创建一个结构体,结构体中包含了三个成员:
index:通常是一个标识符或索引,用于标识该引脚的具体位置。
GPIO##gpio:指定了 GPIO 端口(如 GPIOA、GPIOB 等)。
GPIO_PIN_##gpio_index:指定了具体的引脚(如 GPIO_PIN_0、GPIO_PIN_1 等)。
stm32_pin_write123456789101112static void stm32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value){ const struct pin_index *index; index = get_pin(pin); if (index == RT_NULL) { return ...
RT-Thread-2-时钟管理
一、时钟节拍
时钟节拍是特定的周期性中断,这个中断可以看做是系统心跳,中断之间的时间间隔取决于不同的应用,一般是 1ms–100ms,时钟节拍率越快,系统的实时响应越快,但是系统的额外开销就越大,从系统启动开始计数的时钟节拍数称为系统时间。
时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义来调整,等于 1/RT_TICK_PER_SECOND 秒。
二、时钟节拍的实现方式中断触发模式的硬件定时器产生,当中断到来时,将调用一次:void rt_tick_increase(void),
123456789void SysTick_Handler(void){ /* 进入中断 */ rt_interrupt_enter(); …… rt_tick_increase(); /* 退出中断 */ rt_interrupt_leave();}
在中断函数中调用 rt_tick_increase() 对全局变量 rt_tick 进行自加
12345678910111213141516171819202 ...
RT-Thread-1-线程管理
一、线程栈
RT-Thread 线程具有独立的栈,当进行线程切换时,会将当前线程的上下文存在栈中,当线程要恢复运行时,再从栈中读取上下文信息,进行恢复。
线程栈还用来存放函数中的局部变量:函数中的局部变量从线程栈空间中申请;函数中局部变量初始时从寄存器中分配(ARM 架构),当这个函数再调用另一个函数时,这些局部变量将放入栈中。
线程栈大小可以这样设定,对于资源相对较大的 MCU,可以适当设计较大的线程栈;也可以在初始时设置较大的栈,例如指定大小为 1K 或 2K 字节,然后在 FinSH 中用 list_thread 命令查看线程运行的过程中线程所使用的栈的大小,通过此命令,能够看到从线程启动运行时,到当前时刻点,线程使用的最大栈深度,而后加上适当的余量形成最终的线程栈大小,最后对栈空间大小加以修改。
二、线程状态
状态
描述
初始状态
当线程刚开始创建还没开始运行时就处于初始状态;在初始状态下,线程不参与调度。此状态在 RT-Thread 中的宏定义为 RT_THREAD_INIT
就绪状态
在就绪状态下,线程按照优先级排队,等待被执行;一旦当前线程运行完毕让 ...
RT-Thread-1-ADC
一、 初始化设备stm32_adc_init() 进行板级初始化
1.1定义adc_config数组
数组中有几个值通过board.h中的宏定义来确定,同时数组中的最后一个元素后面在某些标准下是被允许加逗号的
如果打开ADC1和ADC2,那么
1adc_config[] ={ADC1_CONFIG,ADC3_CONFIG};
1.2 ADC1_CONFIG是什么
1.3 ADC_HandleTypeDef是什么类型是 STM32 HAL(硬件抽象层)库 中的一个结构体,用于表示 ADC(模拟到数字转换器) 外设的配置和状态
Instance
类型:ADC_TypeDef *
描述:指向 ADC 模块寄存器的指针。不同的 STM32 微控制器有多个 ADC 模块(如 ADC1, ADC2, ADC3 等),Instance 用于标识当前操作的是哪个 ADC 模块。
Init
类型:ADC_InitTypeDef
描述
:包含 ADC 初始化配置的结构体。它包含了多个配置选项,如 ADC 时钟、分辨率、数据对齐方式等。
1ADC_InitTyp ...
RT-Thread-0-启动流程
一、startup_stm32f407xx.S系统进入汇编文件
RT-Thread使用的是GCC
二、不同编译器的启动函数调用stm32f407_demo3\rt-thread\src\components.c中的$Sub$$main()
三、调用rtthread_startup(void)在stm32f407_demo3\rt-thread\src\components.c中
1234567891011121314151617181920212223242526272829303132333435int rtthread_startup(void){ /* 禁用了所有中断 */ rt_hw_interrupt_disable(); /* 执行板级支持包(BSP)初始化 包括配置硬件、系统时钟、外设初始化等 */ rt_hw_board_init(); /* 打印 RT-Thread 操作系统的版本信息 */ rt_show_version(); /* 初始化操作系统的定时器子系统 */ rt_system_ti ...
蓝桥杯嵌入式模块使用指北
引言本文不涉及原理,只涉及模块的使用
南京工业大学浦江学院 22级自动化 姚道文
[TOC]
零、项目新建和LCD底层移植链接: 项目新建和LCD底层移植
一、Systick系统滴答定时器
24位向下递减计数器,0~16,777,216
CubeMAX会自动将Systick配置成1ms中断的定时器,并将变量uwTick每1ms增加1
精确延时:HAL_Delay()函数,但会阻塞程序,在while中应控制在10s以内
12345/*程序每1ms进入1次该函数*/void SysTick_Handler(void){ HAL_IncTick();}
二、KEY模块1.KEY模块CubeMX设置
2.KEY模块代码1.main.c文件1#inlcude "key.h"
2.key.c文件宏定义的括号不可省略,想想#define KB1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)和
KB1 = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);有什么区别!!!
12345678910 ...
GPIO基础知识
GPIO:通用型输入输出,可以控制输入输出的STM32引脚
浮空输入
Input floating
拉上输入
Input pull-up
下拉输入
Input-pull-down
模拟输入
Anglog
开漏输出
Output open-drain
推挽输出
Output push-pull
推挽复用
Alternate function push-pull
开漏复用
Alternate function open-drain
输出模式:控制端口输出高电平低电平,用于驱动LED,蜂鸣器等,若十大功率器件,则要加上驱动器(小电流控制大电流)
输入模式:读取端口的高低电平,用于读取外接按键,外接模拟信号的输入,ADC电压采集,模拟通信协议接受数据等
端口位设置/清除寄存器(GPIOx_BSRR)(x=A…E):低位用于设置ODRy位为1,高位用于设置ODRy位为0
端口输出数据寄存器(GPIOx_ODR)(x=A..E):可以分别地对各个ODR位进行独立的设置/清除
一、推挽输出
当输出控制为1时
P ...
LVGL(二)部件部分
一、标签控件主体 滚动条 选中的文本
1 .创建标签部件1lv_obj_t *label =lv_label_create(lv_scr_act()); //create中传入父对象
2. 设置文本的三种方式
直接设置文本,存储文本的内存动态分配
1lv_label_set_text(label,"hello\n lvgl");
文本不存储在动态内存,而是在指定的缓冲区中,代码块中只读,修改可能会崩溃(慎用)
1lv_label_set_text_static(label,"hello");
格式化显示文本,类似printf
1lv_label_set_text_fmt(label,"Value:%d",50);
3.设置文本样式
背景颜色
123lv_obj_set_style_bg_color(label, //父对象 lv_color_hex(0xff0000), //十六进制颜色 LV_STATE_DEFAULT); //触 ...
LVGL(一)基础对象
一、对象的创建和基础设置1.1 代码123obj = lv_obj_create(lv_screen_active()); //在当前活动的屏幕上创建一个对象lv_obj_set_size(obj, LV_PCT(40), LV_PCT(30));//设置 obj 对象的尺寸lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0); //将 obj 对象对齐
1.2 说明
lv_screen_active()获取当前活动屏幕
LV_PCT(40)宽度占屏幕宽度的 40%。
LV_ALIGN_CENTER将对象对齐到屏幕的中心位置
0,0相对位置偏移量,意味着对象的中心点与屏幕的中心对齐,没有偏移
123456789lv_obj_t * obj = lv_obj_create(lv_screen_active());//窗机爱你对象lv_obj_set_size(obj,300, 300); //设置对象宽高lv_obj_update_layout(obj); //强制计算大小LV_LOG_USER("w:%d\ ...
I2C通信协议
一、RTC_Init()1.1 RTC_HandleTypeDef
Instance:指向 RTC 外设寄存器基地址
Init:包含初始化 RTC 所需的参数
Lock:用于锁定和解锁 RTC 外设
State:定义 RTC 的状态
1.2 RTC_InitTypeDef
HourFormat:设置 RTC 的小时制格式
RTC_HOURFORMAT_24:使用 24 小时制
RTC_HOURFORMAT_12:使用 12 小时制
AsynchPrediv:设置 RTC 外设的异步预分频器
通常设置为 127
SynchPrediv:RTC 的同步预分频器
通常设置为 255
OutPut:选择将哪个信号输出到 RTC 输出引脚
RTC_OUTPUT_DISABLE:禁用 RTC 输出
RTC_OUTPUT_ALARMA:闹钟 A 输出
RTC_OUTPUT_ALARMB:闹钟 B 输出
RTC_OUTPUT_WAKEUP:唤醒信号输出
OutPutPolarity:配置输出信号的极性
RTC_OUTPUT_POLARITY_HI ...