已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一 一 本课内容概述本课内容概述 这一课的主要内容是 STM32 系统时钟定时器 systick 的配置以及如何产生 精确延时 通常实现 Delay N 函数的方法为 for i 0 i CFGR uint32 t RCC CFGR PPRE1 DIV2 表明 TIM3CLK 为 72MHz 因此 每次进入 中 断服务程序间隔时间为 1 TIM Prescaler 72M 1 TIM Period 1 7199 72M 1 9999 1 秒 定时器的基本设置 1 TIM TimeBaseStructure TIM Prescaler 7199 时钟预分频数 例如 时 钟频率 72 时钟预分频 1 2 TIM TimeBaseStructure TIM Period 9999 自动重装载寄存器周期的值 定时 时间 累计 0 xFFFF 个频率后产生个更新或者中断 也是说定时时间到 3 TIM TimeBaseStructure TIM CounterMode TIM1 CounterMode Up 定时器 模式 向上计数 4 TIM TimeBaseStructure TIM ClockDivision 0 x0 时间分割值 5 TIM TimeBaseInit TIM2 初始化定时器 2 6 TIM ITConfig TIM2 TIM IT Update ENABLE 打开中断 溢出中断 7 TIM Cmd TIM2 ENABLE 打开定时器 或者 TIM TimeBaseStructure TIM Prescaler 35999 分频 35999 72M 35999 1 2 1Hz 1 秒中断溢出一次 TIM TimeBaseStructure TIM Period 2000 计数值 2000 1 TIM Prescaler 72M 1 TIM Period 1 35999 72M 1 2000 1 秒 STM32 中断优先级和开关总中断 一 中断优先级 STM32 Cortex M3 中的优先级概念 STM32 Cortex M3 中有两个优先级的概念 抢占式优先级和响应优先级 有人把响应优 先级称作 亚优先级 或 副优先级 每个中断源都需要被指定这两种优先级 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应 即中断 嵌套 或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断 当两个中断源的抢占式优先级相同时 这两个中断将没有嵌套关系 当一个中断到来后 如果正在处理另一个中断 这个后到来的中断就要等到前一个中断处理完之后才能被处理 如果这两个中断同时到达 则中断控制器根据他们的响应优先级高低来决定先处理哪一个 如果他们的抢占式优先级和响应优先级都相等 则根据他们在中断表中的排位顺序决定先 处理哪一个 既然每个中断源都需要被指定这两种优先级 就需要有相应的寄存器位记录每个中断的优 先级 在 Cortex M3 中定义了 8 个比特位用于设置中断源的优先级 这 8 个比特位可以有 8 种分配方式 如下 所有 8 位用于指定响应优先级 最高 1 位用于指定抢占式优先级 最低 7 位用于指定响应优先级 最高 2 位用于指定抢占式优先级 最低 6 位用于指定响应优先级 最高 3 位用于指定抢占式优先级 最低 5 位用于指定响应优先级 最高 4 位用于指定抢占式优先级 最低 4 位用于指定响应优先级 最高 5 位用于指定抢占式优先级 最低 3 位用于指定响应优先级 最高 6 位用于指定抢占式优先级 最低 2 位用于指定响应优先级 最高 7 位用于指定抢占式优先级 最低 1 位用于指定响应优先级 这就是优先级分组的概念 Cortex M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级 因此 STM32 把指定中断优先级的寄存器位减少到 4 位 这 4 个寄存器位的分组方式如下 第 0 组 所有 4 位用于指定响应优先级 第 1 组 最高 1 位用于指定抢占式优先级 最低 3 位用于指定响应优先级 第 2 组 最高 2 位用于指定抢占式优先级 最低 2 位用于指定响应优先级 第 3 组 最高 3 位用于指定抢占式优先级 最低 1 位用于指定响应优先级 第 4 组 所有 4 位用于指定抢占式优先级 可以通过调用 STM32 的固件库中的函数 NVIC PriorityGroupConfig 选择使用哪种优先级 分组方式 这个函数的参数有下列 5 种 NVIC PriorityGroup 0 选择第 0 组 NVIC PriorityGroup 1 选择第 1 组 NVIC PriorityGroup 2 选择第 2 组 NVIC PriorityGroup 3 选择第 3 组 NVIC PriorityGroup 4 选择第 4 组 接下来就是指定中断源的优先级 下面以一个简单的例子说明如何指定中断源的抢占式优 先级和响应优先级 选择使用优先级分组第 1 组 NVIC PriorityGroupConfig NVIC PriorityGroup 1 使能 EXTI0 中断 NVIC InitStructure NVIC IRQChannel EXTI0 IRQChannel NVIC InitStructure NVIC IRQChannelPreemptionPriority 1 指定抢占式优先级别 1 NVIC InitStructure NVIC IRQChannelSubPriority 0 指定响应优先级别 0 NVIC InitStructure NVIC IRQChannelCmd ENABLE NVIC Init 使能 EXTI9 5 中断 NVIC InitStructure NVIC IRQChannel EXTI9 5 IRQChannel NVIC InitStructure NVIC IRQChannelPreemptionPriority 0 指定抢占式优先级别 0 NVIC InitStructure NVIC IRQChannelSubPriority 1 指定响应优先级别 1 NVIC InitStructure NVIC IRQChannelCmd ENABLE NVIC Init 要注意的几点是 1 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围 将 可能得到意想不到的结果 2 抢占式优先级别相同的中断源之间没有嵌套关系 3 如果某个中断源被指定为某个抢占式优先级别 又没有其它中断源处于同一个抢占式优 先级别 则可以为这个中断源指定任意有效的响应优先级别 二 开关总中断 在 STM32 Cortex M3 中是通过改变 CPU 的当前优先级来允许或禁止中断 PRIMASK 位 只允许 NMI 和 hard fault 异常 其他中断 异常都被屏蔽 当前 CPU 优先级 0 FAULTMASK 位 只允许 NMI 其他所有中断 异常都被屏蔽 当前 CPU 优先级 1 在 STM32 固件库中 stm32f10 x nvic c 和 stm32f10 x nvic h 定义了四个函数操作 PRIMASK 位和 FAULTMASK 位 改变 CPU 的当前优先级 从而达到控制所有中断的目的 下面两个函数等效于关闭总中断 void NVIC SETPRIMASK void void NVIC SETFAULTMASK void 下面两个函数等效于开放总中断 void NVIC RESETPRIMASK void void NVIC RESETFAULTMASK void 上面两组函数要成对使用 不能交叉使用 例如 第一种方法 NVIC SETPRIMASK 关闭总中断 NVIC RESETPRIMASK 开放总中断 第二种方法 NVIC SETFAULTMASK 关闭总中断 NVIC RESETFAULTMASK 开放总中断 常常使用 NVIC SETPRIMASK Disable Interrupts NVIC RESETPRIMASK Enable Interrupts STM32 时钟系统 STM32 资料 2009 09 23 14 53 阅读 72 评论 0 字号 大大 中中 小小 在 STM32 中 有五个时钟源 为 HSI HSE LSI LSE PLL HSI 是高速内部时钟 RC 振荡器 频率为 8MHz HSE 是高速外部时钟 可接石英 陶瓷谐振器 或者接外部时钟源 频率范围为 4MHz 16MHz LSI 是低速内部时钟 RC 振荡器 频率为 40kHz LSE 是低速外部时钟 接频率为 32 768kHz 的石英晶体 PLL 为锁相环倍频输出 其时钟输入源可选择为 HSI 2 HSE 或者 HSE 2 倍频可选 择为 2 16 倍 但是其输出频率最大不得超过 72MHz 图 1 HSE LSE 时钟源 其中 40kHz 的 LSI 供独立看门狗 IWDG 使用 另外它还可以被选择为实时时钟 RTC 的时 钟源 另外 实时时钟 RTC 的时钟源还可以选择 LSE 或者是 HSE 的 128 分频 RTC 的 时钟源通过 RTCSEL 1 0 来选择 STM32 中有一个全速功能的 USB 模块 其串行接口引擎需要一个频率为 48MHz 的时钟源 该时钟源只能从 PLL 输出端获取 可以选择为 1 5 分频或者 1 分频 也就是 当需要使用 USB 模块时 PLL 必须使能 并且时钟频率配置为 48MHz 或 72MHz 另外 STM32 还可以选择一个时钟信号输出到 MCO 脚 PA8 上 可以选择为 PLL 输出的 2 分频 HSI HSE 或者系统时钟 系统时钟 SYSCLK 它是供 STM32 中绝大部分部件工作的时钟源 系统时钟可选择为 PLL 输出 HSI 或者 HSE 系统时钟最大频率为 72MHz 它通过 AHB 分频器分频后送给 各模块使用 AHB 分频器可选择 1 2 4 8 16 64 128 256 512 分频 其中 AHB 分频器输出的时钟送给 5 大模块使用 送给 AHB 总线 内核 内存和 DMA 使用的 HCLK 时钟 通过 8 分频后送给 Cortex 的系统定时器时钟 直接送给 Cortex 的空闲运行时钟 FCLK 送给 APB1 分频器 APB1 分频器可选择 1 2 4 8 16 分频 其输出一路供 APB1 外设使用 PCLK1 最大频率 36MHz 另一路送给定时器 Timer 2 3 4 倍频器使用 该 倍频器可选择 1 或者 2 倍频 时钟输出供定时器 2 3 4 使用 送给 APB2 分频器 APB2 分频器可选择 1 2 4 8 16 分频 其输出一路供 APB2 外设使用 PCLK2 最大频率 72MHz 另一路送给定时器 Timer 1 倍频器使用 该倍频器 可选择 1 或者 2 倍频 时钟输出供定时器 1 使用 另外 APB2 分频器还有一路输出供 ADC 分频器使用 分频后送给 ADC 模块使用 ADC 分频器可选择为 2 4 6 8 分频 在以上的时钟输出中 有很多是带使能控制的 例如 AHB 总线时钟 内核时钟 各种 APB1 外设 APB2 外设等等 当需要使用某模块时 记得一定要先使能对应的时钟 需要注意的是定时器的倍频器 当 APB 的分频为 1 时 它的倍频值为 1 否则它的倍频值 就为 2 连接在 APB1 低速外设 上的设备有 电源接口 备份接口 CAN USB I2C1 I2C2 UART2 UART3 SPI2 窗口看门狗 Timer2 Timer3 Timer4 注意 USB 模块虽然需要一个单独的 48MHz 时钟信号 但它应 该不是供 USB 模块工作的时钟 而只是提供给串行接口引擎 SIE 使用的时钟 USB 模块 工作的时钟应该是由 APB1 提供的 连接在 APB2 高速外设 上的设备有 UART1 SPI1 Timer1 ADC1 ADC2 所有普通 IO 口 PA PE 第二功能 IO 口 下图是 STM32 用户手册中的时钟系统结构图 通过该图可以从总体上掌握 STM32 的时钟 系统 STM32 外部中断之二 STM32 资料 2009 09 10 21 18 阅读 243 评论 0 字号 大大 中中 小小 STM32 外部中断配置 1 配置中断 1 分配中断向量表 Set the Vector Table base location at 0 x20000000 NVIC SetVectorTable NVIC VectTab RAM 0 x0 2 设置中断优先级 NVIC PriorityGroupConfig NVIC PriorityGroup 0 设置中断优先级 3 初始化外部中断 允许 EXTI4 中断 NVIC InitStructure NVIC IRQChannel EXTI4 IRQChannel 中断通道 NVIC InitStructure NVIC IRQChannelPreemptionPriority PreemptionPriorityValue 强 占优先级 NVIC InitStructure NVIC IRQChannelSubPriority 0 次优先级 NVIC InitStructure NVIC IRQChannelCmd ENABLE 通道中断使能 NVIC Init 初始化中断 注意 如果我们配置的外部针脚为 PA4 或 PB4 或 PC4 PD4 等 那么采用的外部中断 也必须是 EXTI4 同样 如果外部中断针脚是 PA1 PB1 PC1 PD1 那么中断就要用 EXTI1 其他类推 2 配置 GPIO 针脚作为外部中断的触发事件 1 选择 IO 针脚 GPIO InitStructure GPIO Pin GPIO Pin 4 注意 如果的针脚是端口的 4 号针脚 配置的中断一定是 EXTI4 2 配置针脚为输入 GPIO InitStructure GPIO Mode GPIO Mode IN FLOATING 3 初始化针脚 GPIO Init GPIOD 3 配置 EXTI 线 使中断线和 IO 针脚线连接上 1 将 EXTI 线连接到 IO 端口上 将 EXTI 线 4 连接到端口 GPIOD 的第 4 个针脚上 GPIO EXTILineConfig GPIO PortSourceGPIOD GPIO PinSource4 注意 如果配置的针脚是 4 号 那么参数必须是 GPIO PinSource4 如果配置的针脚是 3 号 那么参数必须是 GPIO PinSource3 2 配置中断边沿 配置 EXTI 线 0 上出现下降沿 则产生中断 EXTI InitStructure EXTI Line EXTI Line4 注意 如果配置的 4 号针脚 那么 EXTI Line4 是必须的 EXTI InitStructure EXTI Mode EXTI Mode Interrupt EXTI InitStructure EXTI Trigger EXTI Trigger Falling 下降沿触发 EXTI InitStructure EXTI LineCmd ENABLE 中断线使能 EXTI Init 初始化中断 EXTI GenerateSWInterrupt EXTI Line4 EXTI Line4 中断允许 到此中断配置完成 可以写中断处理函数 举例 配置函数 函数名 NVIC Configration 描述 配置各个中断寄存器 输入 无 输出 无 返回值 无 void NVIC Configration void NVIC InitTypeDef NVIC InitStructure ifdef VECT TAB RAM Set the Vector Table base location at 0 x20000000 NVIC SetVectorTable NVIC VectTab RAM 0 x0 else VECT TAB FLASH Set the Vector Table base location at 0 x08000000 NVIC SetVectorTable NVIC VectTab FLASH 0 x0 endif NVIC PriorityGroupConfig NVIC PriorityGroup 0 设置中断优先级 允许 EXTI4 中断 NVIC InitStructure NVIC IRQChannel EXTI4 IRQChannel NVIC InitStructure NVIC IRQChannelPreemptionPriority PreemptionPriorityValue NVIC InitStructure NVIC IRQChannelSubPriority 0 NVIC InitStructure NVIC IRQChannelCmd ENABLE NVIC Init 允许 EXTI9 中断 NVIC InitStructure NVIC IRQChannel EXTI9 5 IRQChannel NVIC InitStructure NVIC IRQChannelPreemptionPriority 0 NVIC InitStructure NVIC IRQChannelSubPriority 1 NVIC InitStructure NVIC IRQChannelCmd ENABLE NVIC Init 配置 SysTick 处理优先级 优先级以及子优先级 函数名 GPIO Configuration void 描述 配置 TIM2 阵脚 输入 无 输出 无 返回 无 void GPIO Configuration void GPIO InitTypeDef GPIO InitStructure GPIO InitStructure GPIO Pin GPIO Pin 0 GPIO Pin 1 GPIO Pin 2 GPIO Pin 3 GPIO InitStructure GPIO Mode GPIO Mode AF PP GPIO InitStructure GPIO Speed GPIO Speed 50MHz GPIO Init GPIOA GPIO InitStructure GPIO Pin GPIO Pin All GPIO InitStructure GPIO Mode GPIO Mode Out PP GPIO InitStructure GPIO Speed GPIO Speed 2MHz GPIO Init GPIOC 配置 GPIOD 的第一个管角为浮动输入 GPIO InitStructure GPIO Pin GPIO Pin 4 GPIO InitStructure GPIO Mode GPIO Mode IN FLOATING GPIO Init GPIOD 配置 GPIOB 的第 9 个管脚为浮动输入 GPIO InitStructure GPIO Pin GPIO Pin 9 GPIO InitStructure GPIO Mode GPIO Mode IN FLOATING GPIO Init GPIOB 函数 SysTick Configuration 描述 设置 SysTick 输入 无 输出 无 返回值 无 void SysTick Configuration void 配置 HCLK 时钟做为 SysTick 时钟源 SysTick CLKSourceConfig SysTick CLKSource HCLK Div8 系统时钟 8 分频 72MHz NVIC SystemHandlerPriorityConfig SystemHandler SysTick 8 2 SysTick Interrupt each 1000Hz with HCLK equal to 72MHz SysTick SetReload 9000 中断周期 1ms Enable the SysTick Interrupt SysTick ITConfig ENABLE 打开中断 SysTick CounterCmd SysTick Counter Enable SysTick CounterCmd SysTick Counter Clear 函数名 EXTI Configuration 描述 配置 EXTI 线 输入 无 输出 无 返回值 无 void EXTI Configuration void 将 EXTI 线 0 连接到 PA0 GPIO EXTILineConfig GPIO PortSourceGPIOD GPIO PinSource4 配置 EXTI 线 0 上出现下降沿 则产生中断 EXTI InitStructure EXTI Line EXTI Line4 EXTI InitStructure EXTI Mode EXTI Mode Interrupt EXTI InitStructure EXTI Trigger EXTI Trigger Falling EXTI InitStructure EXTI LineCmd ENABLE EXTI Init EXTI GenerateSWInterrupt EXTI Line4 将 EXTI 线 9 连接到 PB9 上 GPIO EXTILineConfig GPIO PortSourceGPIOB GPIO PinSource9 将 EXTI 线 9 上出现下降沿产生中断 EXTI InitStructure EXTI Line EXTI Line9 EXTI InitStructure EXTI Mode EXTI Mode Interrupt EXTI InitStructure EXTI Trigger EXTI Trigger Falling EXTI InitStructure EXTI LineCmd ENABLE EXTI Init EXTI GenerateSWInterrupt EXTI Line9 中断函数 void EXTI4 IRQHandler void if EXTI GetITStatus EXTI Line4 RESET EXTI ClearITPendingBit EXTI Line4 if Ledflag 0 Ledflag 1 GPIOC ODR 0X00000080 else Ledflag 0 GPIOC ODR 注 时钟设置的时候最好加上这句 RCCRCC APB2PeriphClockCmd RCC APB2Periph AFIO ENABLE 使能 AFIO 时钟 STM32 中定时器的时钟源 STM32 资料 2009 07 24 21 34 阅读 277 评论 0 字号 大大 中中 小小 STM32 中有多达 8 个定时器 其中 TIM1 和 TIM8 是能够产生三对 PWM 互补输出的高级 定时器 常用于三相电机的驱动 它们的时钟由 APB2 的输出产生 其它 6 个为普通定时 器 时钟由 APB1 的输出产生 下图是 STM32 参考手册上时钟分配图中 有关定时器时钟部分的截图 从图中可以看出 定时器的时钟不是直接来自 APB1 或 APB2 而是来自于输入为 APB1 或 APB2 的一个倍频器 图中的蓝色部分 下面以定时器 2 7 的时钟说明这个倍频器的作用 当 APB1 的预分频系数为 1 时 这个倍 频器不起作用 定时器的时钟频率等于 APB1 的频率 当 APB1 的预分频系数为其它数值 即预分频系数为 2 4 8 或 16 时 这个倍频器起作用 定时器的时钟频率等于 APB1 的 频率两倍 假定 AHB 36MHz 因为 APB1 允许的最大频率为 36MHz 所以 APB1 的预分频系数可以 取任意数值 当预分频系数 1 时 APB1 36MHz TIM2 7 的时钟频率 36MHz 倍频器不 起作用 当预分频系数 2 时 APB1 18MHz 在倍频器的作用下 TIM2 7 的时钟频率 36MHz 有人会问 既然需要 TIM2 7 的时钟频率 36MHz 为什么不直接取 APB1 的预分频系数 1 答案是 APB1 不但要为 TIM2 7 提供时钟 而且还要为其它外设提供时钟 设置这 个倍频器可以在保证其它外设使用较低时钟频率时 TIM2 7 仍能得到较高的时钟频率 再举个例子 当 AHB 72MHz 时 APB1 的预分频系数必须大于 2 因为 APB1 的最大频 率只能为 36MHz 如果 APB1 的预分频系数 2 则因为这个倍频器 TIM2 7 仍然能够得 到 72MHz 的时钟频率 能够使用更高的时钟频率 无疑提高了定时器的分辨率 这也正 是设计这个倍频器的初衷 STM32 笔记之外部中断 GPIO STM32 资料 2009 07 14 13 35 阅读 331 评论 0 字号 大大 中中 小小 b 初始化函数定义 void EXTI Configuration void 定义 IO 中断初始化函数 c 初始化函数调用 EXTI Configuration IO 中断初始化函数调用简单应用 d 初始化函数 void EXTI Configuration void EXTI InitTypeDef EXTI InitStructure EXTI 初始化结构定义 EXTI ClearITPendingBit EXTI LINE KEY BUTTON 清除中断标志 GPIO EXTILineConfig GPIO PortSourceGPIOA GPIO PinSource3 管脚选择 GPIO EXTILineConfig GPIO PortSourceGPIOA GPIO PinSource4 GPIO EXTILineConfig GPIO PortSourceGPIOA GPIO PinSource5 GPIO EXTILineConfig GPIO PortSourceGPIOA GPIO PinSource6 EXTI InitStructure EXTI Mode EXTI Mode Interrupt 事件选择 EXTI InitStructure EXTI Trigger EXTI Trigger Falling 触发模式 EXTI InitStructure EXTI Line EXTI Line3 EXTI Line4 线路选择 EXTI InitStructure EXTI LineCmd ENABLE 启动中断 EXTI Init 初始化 e RCC 初始化函数中开启 I O 时钟 RCC APB2PeriphClockCmd RCC APB2Periph GPIOA ENABLE GPIO 初始化函数中定义输入 I O 管脚 IO 输入 GPIOA 的 4 脚输入 GPIO InitStructure GPIO Pin GPIO Pin 4 GPIO InitStructure GPIO Mode GPIO Mode IPU 上拉输入 GPIO Init GPIOA 初始化 f 在 NVIC 的初始化函数里面增加以下代码打开相关中断 NVIC InitStructure NVIC IRQChannel EXTI9 5 IRQChannel 通道 NVIC InitStructure NVIC IRQChannelPreemptionPriority 0 占先级 NVIC InitStructure NVIC IRQChannelSubPriority 0 响应级 NVIC InitStructure NVIC IRQChannelCmd ENABLE 启动 NVIC Init 初始化 g 在 stm32f10 x it c 文件中找到 void USART1 IRQHandler 函数 在其中添入执行代码 一般最少三个步骤 先使用 if 语句判断是发生那个中断 然后清除中断标志位 最后给字 符串赋值 或做其他事情 if EXTI GetITStatus EXTI Line3 RESET 判断中断发生来源 EXTI ClearITPendingBit EXTI Line3 清除中断标志 USART SendData USART1 0 x41 发送字符 a GPIO WriteBit GPIOB GPIO Pin 2 BitAction 1 GPIO ReadOutputDataBit GPIOB GPIO Pin 2 LED 发生明暗交替 h 中断注意事项 中断发生后必须清除中断位 否则会出现死循环不断发生这个中断 然后需要对中断类型 进行判断再执行代码 使用 EXTI 的 I O 中断 在完成 RCC 与 GPIO 硬件设置之后需要做三件事 初始化 EXTI NVIC 开中断 编写中断执行代码 STM32 的 USART STM32 资料 2009 07 14 13 33 阅读 489 评论 4 字号 大大 中中 小小 b 初始化函数定义 void USART Configuration void 定义串口初始化函数 c 初始化函数调用 void UART Configuration void 串口初始化函数调用 初始化代码 void USART Configuration void 串口初始化函数 串口参数初始化 USART InitTypeDef USART InitStructure 串口设置恢复默认参数 初始化参数设置 USART InitStructure USART BaudRate 9600 波特率 9600 USART InitStructure USART WordLength USART WordLength 8b 字长 8 位 USART InitStructure USART StopBits USART StopBits 1 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 打开 Rx 接收 和 Tx 发送功能 USART Init USART1 初始化 USART Cmd USART1 ENABLE 启动串口 RCC 中打开相应串口 RCC APB2PeriphClockCmd RCC APB2Periph USART1 ENABLE GPIO 里面设定相应串口管脚模式 串口 1 的管脚初始化 GPIO InitStructure GPIO Pin GPIO Pin 9 管脚 9 GPIO InitStructure GPIO Mode GPIO Mode AF PP 复用推挽输出 GPIO Init GPIOA TX 初始化 GPIO InitStructure GPIO Pin GPIO Pin 10 管脚 10 GPIO InitStructure GPIO Mode GPIO Mode IN FLOATING 浮空输入 GPIO Init GPIOA RX 初始化 d 简单应用 发送一位字符 USART SendData USART1 数据 发送一位数据 while USART GetFlagStatus USART1 USART FLAG TXE RESET 等待发送完毕 接收一位字符 while USART GetFlagStatus USART1 USART FLAG RXNE RESET 等待接收完毕 变量 USART ReceiveData USART1 接受一个字节 发送一个字符串 先定义字符串 char rx data 250 然后在需要发送的地方添加如下代码 int i 定义循环变量 while rx data 0 循环逐字输出 到结束字 0 USART SendData USART1 rx data 发送字符 while USART GetFlagStatus USART1 USART FLAG TXE RESET 等待字符发 送完毕 i e USART 注意事项 发动和接受都需要配合标志等待 只能对一个字节操作 对字符串等大量数据操作需要写函数 使用串口所需设置 RCC 初始化里面打开 RCC APB2PeriphClockCmd RCC APB2Periph USARTx GPIO 里面管脚设定 串口 RX 50Hz IN FLOATING 串 口 TX 50Hz AF PP f printf 函数重定义 不必理解 调试通过以备后用 1 需要 c 标准函数 include stdio h 2 粘贴函数定义代码 define PUTCHAR PROTOTYPE int io putchar int ch 定义为 putchar 应用 3 RCC 中打开相应串口 4 GPIO 里面设定相应串口管脚模式 6 增加为 putchar 函数 int putchar int c putchar 函数 if c n putchar r 将 printf 的 n 变成 r USART SendData USART1 c 发送字符 while USART GetFlagStatus USART1 USART FLAG TXE RESET 等待发送结束 return c 返回值 8 通过 试验成功 printf 使用变量输出 c 字符 d 整数 f 浮点数 s 字符串 n 或 r 为换行 注意 只能用于 main c 中 3 NVIC 串口中断的应用 a 目的 利用前面调通的硬件基础 和几个函数的代码 进行串口的中断输入练习 因为在实际应用中 不使用中断进行的输入是效率非常低的 这种用法很少见 大部分串 口的输入都离不开中断 b 初始化函数定义及函数调用 不用添加和调用初始化函数 在指定调试地址的时候 已经调用过 在那个 NVIC Configuration 里面添加相应开中断代码就行了 c 过程 i 在串口初始化中 USART Cmd 之前加入中断设置 USART ITConfig USART1 USART IT TXE ENABLE TXE 发送中断 TC 传输完成中 断 RXNE 接收中断 PE 奇偶错误中断 可以是多个 ii RCC GPIO 里面打开串口相应的基本时钟 管脚设置 iii NVIC 里面加入串口中断打开代码 NVIC InitTypeDef NVIC InitStructure 中断默认参数 NVIC InitStructure NVIC IRQChannel USART1 IRQChannel 通道设置为串口 1 中断 NVIC InitStructure NVIC IRQChannelPreemptionPriority 0 中断占先等级 0 NVIC InitStructure NVIC IRQChannelSubPriority 0 中断响应优先级 0 NVIC InitStructure NVIC IRQChannelCmd ENABLE 打开中断 NVIC Init 初始化 iv 在 stm32f10 x it c 文件中找到 void USART1 IRQHandler 函数 在其中添入执行代码 一般最少三个步骤 先使用 if 语句判断是发生那个中断 然后清除中断标志位 最后给字 符串赋值 或做其他事情 void USART1 IRQHandler void 串口 1 中断 char RX dat 定义字符变量 if USART GetITStatus USART1 USART IT RXNE RESET 判断发生接收中断 USART ClearITPendingBit USART1 USART IT RXNE 清除中断标志 GPIO WriteBit GPIOB GPIO Pin 10 BitAction 0 x01 开始传输 RX dat USART ReceiveData USART1 接收数据 整理除去前两 位 USART SendData USART1 RX dat 发送数据 while USART GetFlagStatus USART1 USART FLAG TXE RESET 等待发送结束 d 中断注意事项 可以随时在程序中使用 USART ITConfig USART1 USART IT TXE DISABLE 来关闭中 断响应 NVIC InitTypeDef NVIC InitStructure 定义一定要加在 NVIC 初始化模块的第一句 全局变量与函数的定义 在任意 c 文件中定义的变量或函数 在其它 c 文件中使用 extern 定义代码再次定义就可以直接调用了 STM32 运行的必要硬件库 STM32 资料 2009 07 14 13 31 阅读 163 评论 0 字号 大大 中中 小小 0 实验之前的准备 a 接通串口转接器 b 下载 IO 与串口的原厂程序 编译通过保证调试所需硬件正常 1 flash lib nvic rcc 和 GPIO 基础程序库编写 a 这几个库函数中有一些函数是关于芯片的初始化的 每个程序中必用 为保障程序 品质 初学阶段要求严格遵守官方习惯 注意 官方程序库例程中有个 platform config h 文件 是专门用来指定同类外设中第几号外设被使用 就是说在 main c 里面所有外设序号 用 x 代替 比如 USARTx 程序会到这个头文件中去查找到底是用那些外设 初学的时候 参考例程别被这个所迷惑住 b 全部必用代码取自库函数所带例程 并增加逐句注释 c 习惯顺序 Lib debug RCC 包括 Flash 优化 NVIC GPIO d 必用模块初始化函数的定义 void RCC Configuration void 定义时钟初始化函数 void GPIO Configuration void 定义管脚初始化函数 void NVIC Configuration void 定义中断管理初始化函数 void Delay vu32 nCount 定义延迟函数 e Main 中的初始化函数调用 RCC Configuration 时钟初始化函数调用 NVIC Configuration 中断初始化函数调用 GPIO Configuration 管脚初始化函数调用 f Lib 注意事项 属于 Lib 的 Debug 函数的调用 应该放在 main 函数最开始 不要改变其位置 g RCC 注意事项 Flash 优化处理可以不做 但是两句也不难也不用改参数 根据需要开启设备时钟可以节省电能 时钟频率需要根据实际情况设置参数 h NVIC 注意事项 注意理解占先优先级和响应优先级的分组的概念 i GPIO 注意事项 注意以后的过程中收集不同管脚应用对应的频率和模式的设置 作为高低电平的 I O 所需设置 RCC 初始化里面打开 RCC APB2 PeriphClockCmd RCC APB2Periph GPIOA GPIO 里面管脚设定 IO 输出 50MHz Out PP IO 输入 50MHz IPU j GPIO 应用 GPIO WriteBit GPIOB GPIO Pin 2 Bit RESET 重置 GPIO WriteBit GPIOB GPIO Pin 2 BitAction 0 x01 写入 1 GPIO WriteBit GPIOB GPIO Pin 2 BitAction 0 x00 写入 0 GPIO ReadInputDataBit GPIOA GPIO Pin 6 读入 IO k 简单 Delay 函数 void Delay vu32 nCount 简单延时函数 for nCount 0 nCount 基于 STM32 的 PWM 输出 STM32 资料 2009 07 14 13 30 阅读 449 评论 2 字号 大大 中中 小小 c 初始化函数定义 void TIM Configuration void 定义 TIM 初始化函数 d 初始化函数调用 TIM Configuration TIM 初始化函数调用 e 初始化函数 不同于前面模块 TIM 的初始化分为两部分 基本初始化和通道初 始化 void TIM Configuration void TIM 初始化函数 TIM TimeBaseInitTypeDef TIM TimeBaseStructure 定时器初始化结构 TIM OCInitTypeDef TIM OCInitStructure 通道输出初始化结构 TIM3 初始化 TIM TimeBaseStructure TIM Period 0 xFFFF 周期 0 FFFF TIM TimeBaseStructure TIM Prescaler 5 时钟分频 TIM TimeBaseStructure TIM ClockDivision 0 时钟分割 TIM TimeBaseStructure TIM CounterMode TIM CounterMode Up 模式 TIM TimeBaseInit TIM3 基本初始化 TIM ITConfig TIM3 TIM IT CC4 ENABLE 打开中断 中断需要这行代码 TIM3 通道初始化 TIM OCStructInit 默认参数 TIM OCInitStructure TIM OCMode TIM OCMode PWM1 工作状态 TIM OCInitStructure TIM OutputState TIM OutputState Enable 设定为输出 需要 PWM 输出才需要这行代码 TIM OCInitStructure TIM Pulse 0 x2000 占空长度 TIM OCInitStructure TIM OCPolarity TIM OCPolarity High 高电平 TIM OC4Init TIM3 通道初始化 TIM Cmd TIM3 ENABLE 启动 TIM3 f RCC 初始化函数中加入 TIM 时钟开启 RCC APB2PeriphClockCmd RCC APB2Periph TIM3 ENABLE g GPIO 里面将输入和输出管脚模式进行设置 信号 AF PP 50MHz h 使用中断的话在 NVIC 里添加如下代码 打开 TIM2 中断 NVIC InitStructure NVIC IRQChannel TIM2 IRQChannel 通道 NVIC InitStructure NVIC IRQChannelPreemptionPriority 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《GBT 31427-2015 煤灰熔融性测定仪技术条件》专题研究报告
- 2025年自考护理学(专科)《儿科护理学》模拟卷及答案
- 2025年驾照考试科目四1500题(新题型)及答案(七)
- 厂矿用机车司机安全文明考核试卷含答案
- 玻璃钢制品喷射工安全文明考核试卷含答案
- 经编机操作工岗前工作标准化考核试卷含答案
- 动物胶提胶浓缩工设备技术规程
- 汽车电气装调工岗位应急处置技术规程
- 桥式起重机司机岗位合规化技术规程
- 资产管理师风险评估与管理水平考核试卷含答案
- 货代操作手册
- 神话故事民间故事《后羿射日》绘本课件
- 生产经理年终总结
- 屋架平房仓计算书
- 《安全阀培训》课件
- GB/T 32151.30-2024温室气体排放核算与报告要求第30部分:水运企业
- 大模型在医疗AI中的应用
- 档案数字化加工技术方案
- 高标准农田改造提升建设项目投标方案(技术标)
- 第二单元 互联网中信息获取-探寻中国大运河的璀璨 信息的搜索与遴选 教学设计 2023-2024学年苏科版(2023)初中信息技术七年级上册
- 第02讲空间几何体的外接球与内切球(学生版)
评论
0/150
提交评论