|
从寄存器操作到硬件抽象层:STM32开发库的演进。 演进历程STM32微控制器自2007年推出以来,STMicroelectronics为其提供了多套软件开发库,经历了从直接寄存器操作到高度抽象化的演进过程: 发展时间线
抽象层次中等高低8 \/ ~$ _" m' U0 @ 代码体积中等大小3 z5 u9 r6 K" A 执行效率高中等高 I" y4 E! G! ~( h, c 学习难度中等低高 可移植性低高中等0 W$ L0 v- @9 q( F0 T% f 维护状态已停止活跃活跃6 @# ^7 S' o7 G: r+ ~ 工具支持无CubeMXCubeMX标准外设库(SPL)设计理念 SPL采用"一个外设一个文件"的设计理念,每个外设都有对应的.c和.h文件,提供中等层次的抽象。 核心特点// SPL典型用法示例. F* h+ _& Z f0 ?4 xvoid GPIO_Config(void)7 E) J' _! v G: F% g { GPIO_InitTypeDef GPIO_InitStructure;8 q0 E1 d% X/ G // 使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);3 ?: f. @7 |! \ . R3 G% E7 M$ } // 配置GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;: b n: V" [+ R. a GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;+ B1 C2 X* y* c# @ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 _, ~; A( s6 m GPIO_Init(GPIOA, &GPIO_InitStructure);& N* l- h& ` v0 C- J }优势
HAL库采用"硬件抽象层"设计,旨在提供跨系列的统一API接口,隐藏硬件细节。 核心特点// HAL库典型用法示例7 I4 _& N! A: H% t0 N$ ]void GPIO_Config(void). R, W) e& L# Q5 ]# A { GPIO_InitTypeDef GPIO_InitStruct = {0}; // 使能GPIO时钟* O0 T8 A- h2 _7 r6 w; A8 S __HAL_RCC_GPIOA_CLK_ENABLE();/ C" l6 q" \* Z8 } // 配置GPIO GPIO_InitStruct.Pin = GPIO_PIN_5;* g( |/ T: l9 B/ h! f2 Y GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;" l9 u d3 }1 _0 K+ ^ GPIO_InitStruct.Pull = GPIO_NOPULL;' X) z9 X0 Q% C2 h6 d3 z& H GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; L9 H8 z8 j7 ?: x; m8 B/ ~ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);- Q$ Z$ [/ ~+ ~$ Y6 L }架构优势
LL库是HAL库的补充,提供更接近硬件的接口,同时保持一定的可移植性。 核心特点// LL库典型用法示例/ F8 M$ X9 x2 f! @void GPIO_Config(void) {7 ]9 |$ S$ ^. k, ^& }7 ?4 t // 使能GPIO时钟1 H* h& M* V( B4 ?9 o y7 C+ F+ e& } LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);" _. y7 A5 C9 U // 配置GPIO LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT); LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_5, LL_GPIO_OUTPUT_PUSHPULL); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_5, LL_GPIO_SPEED_FREQ_HIGH); }优势
{( k, U1 q' e% ^ ~' Q( u8 U% Y& ~ USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); , ^8 D O! V0 n0 L7 h/ ^" r+ a( d // 配置GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); 3 O8 t# o3 l6 n# u3 F GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX3 t) T, w+ } k6 X, F GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);9 p1 P+ C F, y% c# n . S2 D; }" s# D, ^9 v0 L& w* T // 配置UART USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1;3 x- L) |$ S# P USART_InitStructure.USART_Parity = USART_Parity_No;- r ^% G( E; e# q5 b USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;: w1 u! Q: A; o5 o2 W USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure);" I# X$ W6 s, `0 S1 U7 u$ S USART_Cmd(USART1, ENABLE); } 3 c/ x7 ?, [2 U- L9 i0 y voidUART_SendString(char* str) {* ]/ b" K2 W: ?7 Q while(*str) {3 ^3 f0 S! \) t* E5 q0 g$ E while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);4 T' v& z4 r7 o# P7 j3 C USART_SendData(USART1, *str++);8 V: ~* I' n% x' E; ?# Q }. n1 U. Q" _2 A- S0 c0 _7 W# w }HAL方式void UART_Config(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; " \* `, K# h( G6 g( J3 ?; [- N+ R // 使能时钟. N/ _, V7 V4 \2 ^ __HAL_RCC_USART1_CLK_ENABLE();8 q' }/ |$ g* C# a0 j8 P __HAL_RCC_GPIOA_CLK_ENABLE();. Y& q. L V; }' q: D( d7 ` // 配置GPIO GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;! F4 U; e2 R9 Y- c ^9 n" R GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);7 A5 F/ |4 M, H3 |- R: r, I* R4 A & R2 {5 s! u4 n; y- m- z GPIO_InitStruct.Pin = GPIO_PIN_10;% n" K) t5 g" Y2 B GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;. p1 n+ F) N4 N* q) ]8 c3 Z HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);' j; |8 n3 G) ^1 V* a : z: N0 M' z/ ?/ n) N" ~ Y // 配置UART% Y3 J* T, R0 H& m% Q huart1.Instance = USART1; huart1.Init.BaudRate = 115200;& y6 l( @+ ~1 c. {$ m huart1.Init.WordLength = UART_WORDLENGTH_8B;6 s: H, A- ] h huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE;% I6 ]% L2 ^- ^ K, V* ^ huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;: j1 K$ I: ~( {8 Q huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1);% [1 w9 {9 w6 K8 w. V9 ` } 2 e, h/ y Z- ?% k9 J voidUART_SendString(char* str)2 x+ h; l3 d5 e, R% | {7 |1 [) N/ w4 J6 Q. F4 |. f HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY); }LL方式void UART_Config(void)7 A5 _* k3 R9 w$ p* x/ M { // 使能时钟0 g/ M, b; D/ i+ C6 @1 P- ]( A3 r LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);- u# I+ B+ ^! m. k) Z 7 z; h* B. k0 ^! D# c& g9 q // 配置GPIO LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_9, LL_GPIO_AF_7); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_9, LL_GPIO_SPEED_FREQ_HIGH);3 d( m* z/ J: d w$ f# `" ~$ I* y LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_10, LL_GPIO_AF_7);/ S7 s0 j$ t" X2 h0 @2 v // 配置UART LL_USART_SetBaudRate(USART1, 115200);. q" q5 k! _ e( R LL_USART_SetDataWidth(USART1, LL_USART_DATAWIDTH_8B); LL_USART_SetStopBitsLength(USART1, LL_USART_STOPBITS_1);9 Z6 k7 j/ @( _1 \ LL_USART_SetParity(USART1, LL_USART_PARITY_NONE);0 \& N& U# _( } ^9 y) C$ U+ } LL_USART_SetTransferDirection(USART1, LL_USART_DIRECTION_TX_RX); LL_USART_Enable(USART1);5 I4 E; a. C: ~6 h6 t7 O% H$ i) K1 w } # |8 P K+ Z1 Q3 k# O# W voidUART_SendString(char* str) {2 s7 T( C9 c1 c while(*str) { while(!LL_USART_IsActiveFlag_TXE(USART1));- X6 X: q. O& x# c$ F; j! @% T% J LL_USART_TransmitData8(USART1, *str++);. o, e" `: a$ I* |4 d e8 k } } ) \5 w# U5 G( @ |
#双节活动 1.在CubeMX中引用touchGFX出现的问题与解决
如何将STM32CubeMX生成的CMake工程导入STM32CubeIDE
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
STM32CubeMX 6.18.0新版本发布
【STM32U3评测】使用INS5699 RTC模组
CubeMX生成CubeIDE工程代码乱码
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
微信公众号
手机版