STM32实验及笔记 —— 📟(001)CMSIS标准学习
»
(001)HAL库LED点灯
(002)HAL库LCD帧动画
(003)HAL库FFT动态频谱
(004)HAL库FFT Speed Up
(005)HAL库认识DMA
(006)看门狗总结
(007)GPIO使用步骤
(008)CubeIDE实现USB外设*
(009)为什么C99
(010)Linux UDP广播注意事项
(011)Linux非阻塞TCP
(012)ARM架构防烧脚本
(013)OpenWrt交叉编译
(014)C99基本数据类型
(015)C99 结构体
(016)C99 枚举
(017)C99 的函数及左值右值
(018)C99 的指针*
(019)C99 只有值赋值,没有move*
(020)C99 数组及结构体中的数组存储空间
(021)C99标准函数库没有函数模板
(022)POSIX线程库pthread的同步锁*
(023)POSIX线程库pthread的多线程*
(024)C99的条件语句
(025)C99的选择语句
(026)C99的循环语句
(027)C99标准库中的计时与等待 *
(028)C语言中的高精度计算库GMP *
(029)C语言中的Web服务*
(030)C语言中的字符转码ICU*
(031)从几个方面显然C语言比C++效率高*
(032)C99中的弱函数weak
(033)MTU TCP SOCKET
(034)STM32 UART连续发送数据函数
(035)STM32 UART连续接收数据函数
(036)STM32重定向printf输出到USART的方法
(037)STM32 Normal与Circle
(038)STM32 UART传输错误标志位的清除
(039)STM32 UART传输空闲中断
(040)STM32 串口、RS232是单根线发数据
(041)STM32 RS485差分信号通信
(042)STM32 等待DMA传输完成指定的字节数
(043)STM32进入低功耗模式
(044)DMA传输完成中断需要清空TCx标志位
(045)STM32软件函数命名规范
(046)在单字节完成中断中处理Idle
(047)C99内置宏
(048)使能中断后中断服务程序才起作用
(049)STM32程序启动过程
(050)STM32热加载新的程序固件
(051)中断向量表的指定
(052)STM32程序内的地址空间
(053)STM32修改主程序存放的地方
(054)Bootloader参考
(055)Keil中的下载算法
(056)编译器优化出错点
🍓(001)关闭交换分区
🍓(002)格式化U盘为ext4并设定块大小为1k
🍓(003)获取linux版本信息及硬件架构信息
🍓(004)最新版Ubuntu加速
🍓(005)不稳定网络克隆360浏览器内核脚本
🍓(006)Ubuntu24.04无法运行firefox注意事项
🍓(007)MAC地址
🍓(008)RMII和PHY
🍓(009)Ubuntu Server防火墙配置
🍓(010)Linux主动让出CPU
🍓(011)Linux硬件概念
🍓(012)Linux系统中的进程间通信
🍓(013)Git禁止强制推送
🍓(014)Git禁止reset --hard
🍓(015)将未写入的缓存立即写入硬盘
🍓(016)拷贝pre-receive到每个git仓库的脚本
🍓(017)sshd密码输入错误禁用IP3分钟
🖥️(001)异机备份低功耗自用Git服务器搭建
🖥️(002)OpenWRT配置注意事项
🕹️(001)while(1){}让出CPU后重进
🕹️(002)FreeRTOS主要函数
🕹️(003)FreeRTOS临界区ENTER_CRITICAL
🕹️(004)FreeRTOS NULL未定义问题的解决
🕹️(005)优先级最低的ARM硬件中断PENDSV
🕹️(006)任务优先级层数配置
🕹️(007)不同优先级任务创建注意事项
🕹️(008)关闭同级任务的时间片轮转
🕹️(009)OTA技术
🕹️(010)FreeRTOS静态任务创建
🕹️(011)FreeRTOS列出任务列表
🕹️(012)FreeRTOS堆空间使用量统计
🕹️(013)FreeRTOS通过任务名获取TaskHandle
🕹️(014)FreeRTOS常用任务创建方式
🕹️(015)FreeRTOS解决优先级反转的任务死锁
🕹️(016)FreeRTOS超级中断:SVC
🕹️(017)FreeRTOS中断处理函数运行在特权级
🕹️(018)FreeRTOS SVC进入用户模式的方法
🕹️(019)FreeRTOS实现绝对时间间隔开始任务
🕹️(020)FreeRTOS低功耗通过Tickless实现
🕹️(021)FreeRTOS IdleHook
🕹️(022)FreeRTOS Hooks
🕹️(023)FreeRTOS主动让出CPU
🕹️(024)FreeRTOS信号量
🕹️(025)FreeRTOS解决优先级反转问题的方法
🕹️(026)FreeRTOS获得任务的优先级
🕹️(027)FreeRTOS设置任务的优先级
🕹️(028)FreeRTOS中函数的前缀
🕹️(029)硬件中断中不能调用FreeRTOS的函数
🕹️(030)底半操作的任务接收信号量处理数据
🕹️(031)启用无限期等待
🕹️(032)中断处理函数中调用FreeRTOS的函数
🕹️(033)对于FreeRTOS顶半与底半操作的原则
🕹️(034)STM32中的FATFS支持exFat
🕹️(035)FreeRTOS中的消息队列
🕹️(036)FreeRTOS中的定时任务
🕹️(037)默认生成代码没法ping板子的原因
🕹️(038)LwIP Tcp Server开发例程
🕹️(039)切记别用mutex
🕹️(040)MEMP与Pbuf的关系
🕹️(041)FreeRTOS连接ESP WiFi(待完成)
📟(001)CMSIS标准学习
🕹️(001)函数调用被优化
RCC->CR
CR: Clock Register

RCC->AHB1ENR

GPIOA->MODER 0 in,1 out,2 AF,3 Analog, 2bit
GPIOA->OSPEEDR 0 low,1 medium,2 high,3 very high, 2bit
GPIOA->OTYPER 0:PP(Push-Pull) 1:OD(Open-Drain), 1bit
GPIOA->PUPDR 0 无上拉/下拉电阻,1 Pull-Up上拉电阻,2 Pull-Down下拉电阻,3 保留, 2bit

SysTick->CTRL
SysTick->LOAD
SysTick->VAL
_CLKSourceConfigure
_Configure

__DSB();
__ISB();
__DMB();
DSB: Data Synchronization Barrier

SCB_DisableICache();
SCB_DisableDCache();
SCB: System Control Block

typedef void (*pFun)(void);//0x**000004
__disable_irq();
SCB->VTOR<==>__set_MSP(userStackPointer);//0x**000000
__enable_irq();

第一个函数:Reset_Handler

startup***.s类似于linux的setup.s

==========================================================
持续更新:20250804
==========================================================

RCC_AHB1ENR_GPIOAEN GPIOA ENABLE
RCC_APB2ENR_USARTxEN USARTx ENABLE

GPIO_MODER_MODER9_0 GPIO_MODER_MODER9_1 GPIO_MODER_MODER9_2 GPIO_MODER_MODER9_3
(数字)输入
(数字)输出
(功能)复用
模拟(输入或输出)

GPIOA->AFR: 功能复用设置寄存器: 最多16种复用功能: 4bit*8*2=32bit*2

USARTx->BRR波特率
USART_CR1_TE发使能
USART_CR1_RE收使能
USART_CR1_UE UART使能

USARTx->SR状态寄存器
USARTx->DR数据寄存器,单字节发送
USART_SR_TXE发送数据为空状态标记位
USART_CR1_RXNEIE接收数据非空中断使能
NVIC_EnableIRQ使能中断回调
NVIC_SetPriority设置中断优先级
USART_SR_RXNE接收非空标记位(已收到数据)
USART收发数据用的同一个DR

错误标记位,判断状态寄存器
USART_SR_ORE: Over Run Error超跑错误
USART_SR_FE:  Frame Error帧错误
USART_SR_NE:  Noise Error噪声错误
USART_SR_PE:  Parity Error奇偶校验错误
如果有错误标记,读取一次SR+DR即可清除

CR3=USART_CR3_DMAT;使能DMA发送
USART1_TX_DMA_STREAM->CR,DMA控制寄存器
DMA_SxCR_CHSEL_0通道选择
DMA_SxCR_MINC内存地址递增
DMA_SxCR_DIR_0内存到外设
DMA_SxCR_TCIE传输完成中断使能
USART1_TX_DMA_STREAM->PAR外设地址寄存器
USART1_TX_DMA_STREAM->M0AR内存0地址
USART1_TX_DMA_STREAM->M1AR内存1地址
USART1_TX_DMA_STREAM->NDTR数据长度
DMA_SxCR_DBM使能双缓冲标记位
DMA_SxCR_EN使能DMA传输标记位

==========================================================
20250805:口诀
==========================================================
CR控制功能,SR读取状态,NVIC中断使能,读写空非空清零

==========================================================
20250806:SPI
==========================================================
SPI_CR1_MSTR Master
SPI_CR1_SSM Slave Select Management从机选择管理,1软件模式,0硬件模式
SPI_CR1_SSI Slave Select Internal内部从机选择,1软件模式:保持高电平(内部NSS),片选通过普通GPIO引脚控制。

SSM=1 + SSI=1,表示NSS(Negotiated Slave Select,协商从机选择)信号由软件管理

SPI_CR1_BR_0波特率分频:2分频
SPI_CR1_SPE启用SPI
SPI_SR_TXE SPI发送为空
SPI_SR_BSY busy标识

中断方式接收:_RXNE
SPI三种错误处理方式
SPIx->SR &= ~SPI_SR_OVR; // 清除溢出标志
SPIx->SR &= ~SPI_SR_CRCE;
SPIx->SR &= ~SPI_SR_MODF;
另一方法:_SPE去使能使能SPI

==========================================================
20250806:改“CMSIS回顾”为“CMSIS标准学习”
==========================================================
SPI_CR1_MSTR Master
SPI_CR1_SSM Slave Select Management从机选择管理,1软件模式,0硬件模式
SPI_CR1_SSI Slave Select Internal内部从机选择,1软件模式:内部NSS保持高电平,片选通过普通GPIO引脚控制。

SSM=1 + SSI=1,表示NSS(Negotiated Slave Select,协商从机选择)信号由软件管理

SPI_CR1_BR_0 波特率分频:2分频,BR:波特率
SPI_CR1_SPE 启用SPI
SPI_SR_TXE SPI 发送为空
SPI_SR_BSY busy标识

中断方式接收:_RXNE
SPI三种错误处理方式
SPIx->SR &= ~SPI_SR_OVR; // 清除溢出标志
SPIx->SR &= ~SPI_SR_CRCERR;
PIx->SR &= ~SPI_SR_FRE;
SPI_SR_MODF处理方式:读取一次SR,去使能使能SPI

==========================================================
20250815:加入ARM芯片I2C相关设置学习内容
==========================================================
I2C_CR2 控制寄存器2,FREQ[5:0]
I2C_CCR 时钟控制寄存器
I2C1->TRISE 最大上升时间
I2C_CR1_PE Peripheral Enable外设使能

I2C_CR1_START 发送起始条件
I2C_SR1_SB 等待START完成
I2C1->DR 发送从设备地址,7位地址 + 写位(0)
I2C_SR1_ADDR 地址匹配标志位,用于判断从设备地址或广播地址是否与主设备发送的地址是否匹配(即:有没有从设备应答)

发送数据:I2C_CR2_DMAEN

I2C_CR1_STOP 发送停止条件
I2C_SR1_AF(Acknowledge Failure)用于检测NACK

I2C_CR2_ITERREN 错误中断使能
NVIC_EnableIRQ(I2C1_ERR_IRQn) 启用中断
I2C1_ER_IRQHandler()

I2C_CR2_ITEVTEN 事件中断使能
NVIC_EnableIRQ(I2C1_EV_IRQn) 启用中断
I2Cx_EV_IRQHandler()

HIFCR:高8位中断标记控制寄存器
DMA_HIFCR_CTCIF6 Clear清除DMA数据流6的传输完成中断标志
DMA_HIFCR_CTEIF6 Clear清除DMA数据流6的传输完错误中断标志
DMA_HIFCR_CDMEIF6 Clear清除DMA数据流6的直接模式错误标志
DMA_HIFCR_CFEIF6 Clear清除DMA数据流6的FIFO 错误标志
DMA_SxCR_PL_0优先级等级

DMA1_Stream6->PAR = (uint32_t)&(I2C1->DR); // 外设地址(I2C数据寄存器)

I2C1->CR2 |= I2C_CR2_DMAEN; 使能I2C1的DMA传输

HISR高8位中断状态寄存器

(持续更新中)
«
——张人杰·www.v-signon.com学习者共勉
返回上一页
备案号:京ICP备19038994号-2
个人作品网站:www.up-task.com 主办:个人 English
网站内容如有侵权,请联系删除:1307776259@qq.com