|
从寄存器操作到硬件抽象层:STM32开发库的演进。 演进历程STM32微控制器自2007年推出以来,STMicroelectronics为其提供了多套软件开发库,经历了从直接寄存器操作到高度抽象化的演进过程: 发展时间线
抽象层次中等高低 代码体积中等大小/ @9 V- a$ e! L6 O9 L 执行效率高中等高& c" M* Z G* C' Y/ d5 S 学习难度中等低高8 R' C" e- _7 u' P3 b2 p( z- t [ 可移植性低高中等 维护状态已停止活跃活跃# ]0 T l% ?& x H8 j- Q 工具支持无CubeMXCubeMX标准外设库(SPL)设计理念 SPL采用"一个外设一个文件"的设计理念,每个外设都有对应的.c和.h文件,提供中等层次的抽象。 核心特点// SPL典型用法示例void GPIO_Config(void) {: M: A2 u! Y' s* h2 R7 z: ? GPIO_InitTypeDef GPIO_InitStructure;) m6 Z) N% p+ d! O4 y3 h // 使能GPIO时钟+ Y, D+ Z6 u" J RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);6 z5 G ^" z6 o3 r8 E. W4 o. V$ _( ] 5 t( [' p, R6 I! ^: m // 配置GPIO: X) W" p- s+ N: {; d GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;( s. m# v6 @4 N: h* \$ i1 q GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;* c3 g$ Z$ H/ w3 ?2 a: N GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); }优势
HAL库采用"硬件抽象层"设计,旨在提供跨系列的统一API接口,隐藏硬件细节。 核心特点// HAL库典型用法示例7 H* o- n: O" ovoid GPIO_Config(void)" ?/ G; E5 m Y4 {1 N { GPIO_InitTypeDef GPIO_InitStruct = {0}; 0 ^. |1 J. _5 b! z/ i: @ // 使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); ! {- a0 ?! u0 j8 Y // 配置GPIO GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;1 v4 h8 j2 D* a/ J& J" K8 }( u GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);( W1 f+ D( Z+ E8 O( r4 v4 \ }架构优势
LL库是HAL库的补充,提供更接近硬件的接口,同时保持一定的可移植性。 核心特点// LL库典型用法示例6 U( P, c3 X2 }# Y5 t: Hvoid GPIO_Config(void)8 j$ c! G: q/ N3 F. T N' h {- L! _ t6 q9 y // 使能GPIO时钟! v9 h2 F. K4 e% h/ ]) V% j LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); ; p0 s7 z8 i# d z // 配置GPIO/ S( y) X H% v) g, K/ X7 S LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT);0 Z& e; q+ ^: ]6 @1 K 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);, x4 y3 y G8 F/ K+ D }优势
{& m" |+ {# @$ T) ]8 z- I; P# F5 O9 t USART_InitTypeDef USART_InitStructure;" p$ u) r2 k5 X GPIO_InitTypeDef GPIO_InitStructure;. W* N7 P5 U! |$ a. h 0 o$ O7 E! @3 S! ~) y! x% E // 使能时钟# [. f( b, V8 k( @5 e, ?# X5 b RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);8 e' }1 Z g% X( g4 {+ a 2 E+ d# U4 h/ t' C* L // 配置GPIO- [' J+ A& K$ `3 S GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // TX) X( ~9 d& i+ @& X- m GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 J1 M4 }- U4 y1 |* { GPIO_Init(GPIOA, &GPIO_InitStructure); ) t6 ^) [$ m/ r/ {& T GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;- h I* N2 d: l4 @) Y GPIO_Init(GPIOA, &GPIO_InitStructure); ; d* p1 I# J G: ^- _ // 配置UART USART_InitStructure.USART_BaudRate = 115200;5 s w. g0 w7 M( Q7 ^ USART_InitStructure.USART_WordLength = USART_WordLength_8b;, _' l$ I p$ g$ Z4 M USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure);( k9 r& L+ M+ N2 I, r+ ^9 F USART_Cmd(USART1, ENABLE);' I8 ^% o" K1 _; ^7 n }; T/ \7 U' C2 ~% h# _% q- U! t : O) u5 i J0 u. i5 A/ q voidUART_SendString(char* str)& Z3 p) _' {" I6 c8 c( M: C {0 Z2 w) s% N& T s while(*str) {+ p; L% u& b! R while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);! E6 T, k9 i6 `& l- G2 I1 r USART_SendData(USART1, *str++);0 m8 d- p: L" s+ v }) e, D* ?& H! J4 M }HAL方式void UART_Config(void) { GPIO_InitTypeDef GPIO_InitStruct = {0};( S# l1 W! n9 m8 W. k2 e // 使能时钟 __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); // 配置GPIO GPIO_InitStruct.Pin = GPIO_PIN_9;0 ]0 B' _' _: P# l GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_10;$ |( }- C; ^7 G- d3 X0 L/ p GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置UART huart1.Instance = USART1;6 ]+ C& @, j' f: p% Q huart1.Init.BaudRate = 115200;) I( b$ z- o& Y: g huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE;" B- }" ^- i5 l T5 V huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1);. S/ t5 ?" `/ ?' J% a8 x }; G7 t& K! g& D5 h. r1 V8 u" L$ N! H % h# e* x F) k3 o8 p4 i% c9 W) k voidUART_SendString(char* str) {: s3 a9 }0 ]# u# m HAL_UART_Transmit(&huart1, (uint8_t*)str, strlen(str), HAL_MAX_DELAY); }LL方式void UART_Config(void); z. w3 x% c$ \7 b4 a {% o+ @& L: P* z: o f( [7 O) | // 使能时钟 LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);/ N+ H* J- p/ d LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); // 配置GPIO LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_ALTERNATE);- Q9 F$ @' ^4 T+ P, N! X/ J 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); 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); 1 l/ l9 u3 I) e* m3 V // 配置UART LL_USART_SetBaudRate(USART1, 115200); LL_USART_SetDataWidth(USART1, LL_USART_DATAWIDTH_8B); LL_USART_SetStopBitsLength(USART1, LL_USART_STOPBITS_1); LL_USART_SetParity(USART1, LL_USART_PARITY_NONE); LL_USART_SetTransferDirection(USART1, LL_USART_DIRECTION_TX_RX); LL_USART_Enable(USART1);$ `8 X' Z; E0 F3 b1 \ }+ c/ P8 o1 N( G0 `: f ! \" Y7 a7 F: a' ^& o1 } voidUART_SendString(char* str)* ~% z9 { {7 A" A3 u H5 h8 p& o { while(*str) {8 k0 [; X) H' W while(!LL_USART_IsActiveFlag_TXE(USART1));: T8 K* c* B% P! l- {, i LL_USART_TransmitData8(USART1, *str++);% B, c3 h O1 `; y% k } } |
如何将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开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
微信公众号
手机版