»
(008)CubeIDE实现USB外设*
(018)C99 的指针*
(019)C99 只有值赋值,没有move*
(022)POSIX线程库pthread的同步锁*
(023)POSIX线程库pthread的多线程*
(027)C99标准库中的计时与等待 *
(028)C语言中的高精度计算库GMP *
(029)C语言中的Web服务*
(030)C语言中的字符转码ICU*
(031)从几个方面显然C语言比C++效率高*
📟(001)CMSIS标准学习
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位中断状态寄存器 (持续更新中)