当前位置: 首页 > news >正文

dw里响应式网站怎么做内网访问 wordpress

dw里响应式网站怎么做,内网访问 wordpress,手机制作小程序,深圳市小程序科技有限公司目录 一、环境搭建及介绍 关于STM32基础介绍 新建工程 外设案例 LED流水灯 蜂鸣器 上拉电阻和下拉电阻知识 电压比较器 c语言基础知识 类型、结构体、枚举 类型int8_t int16_t int32_t 宏替换 #define 和typedef用法 结构体两种填充方法 和 命名规则 枚举用法 常用…目录 一、环境搭建及介绍 关于STM32基础介绍 新建工程 外设案例 LED流水灯 蜂鸣器 上拉电阻和下拉电阻知识 电压比较器 c语言基础知识 类型、结构体、枚举 类型int8_t int16_t int32_t 宏替换 #define 和typedef用法    结构体两种填充方法 和 命名规则 枚举用法 常用配置 输入输出模式 GPIO常用库函数 中断函数 模块化编程  延时函数  System LED函数  Hardwore 按键函数  Hardwore 蜂鸣器函数  Hardwore 震动模块 Hardwore OLED IIC模块Hardwore 调试方法 中断系统 概念 NVIC中断控制寄存器结构  NVIC分组 抢占优先级和响应优先级​编辑 中断配置 --代码----------------- 两个中断时 定时器 定时器类型 定时器时基----基本定时器 通用定时器时钟输入 ​编辑 高级定时器​编辑 代码部分----------------------------- 定时器 ---- PWM PWM控制呼吸灯 ---------------- PWM控制SG90舵机---------------- PWM驱动电机模块 输入捕获测频率 输入捕获测占空比 输入捕获编码器计数 一、环境搭建及介绍 kile4 开发51单片机内置芯片包、kile_v5开发STM32手动添加芯片包、如果要开发51许把51的芯片包放在kile5中 、通过注册机key来破解 对应STM芯片包 也可以通过 通过在线安装其它芯片包 ---- 可以找到GD 以及其他厂家的芯片包 STLink驱动 和CH340驱动安装 管理员运行kile5 复制CLD到注册机 破解 关于STM32基础介绍 片上资源 系统结构 启动过程 新建工程 GPIO介绍 GPIO八种模式 输入配置 当 I/O 端口配置为输入时 ● 输出缓冲器被禁止 ● 施密特触发输入被激活 ● 根据输入配置 ( 上拉下拉或浮动 ) 的不同弱上拉和下拉电阻被连接 ● 出现在 I/O 脚上的数据在每个 APB2 时钟被采样到输入数据寄存器 ● 对输入数据寄存器的读访问可得到 I/O 状态 输出配置 当 I/O 端口被配置为输出时 ● 输出缓冲器被激活 ─ 开漏模式输出寄存器上的 ’ 0 ’ 激活 N-MOS 而输出寄存器上的 ’ 1 ’ 将端口置于高阻状态 (P MOS 从不被激活 ) 。 ─ 推挽模式输出寄存器上的 ’ 0 ’ 激活 N-MOS 而输出寄存器上的 ’ 1 ’ 将激活 P-MOS 。 ● 施密特触发输入被激活 ● 弱上拉和下拉电阻被禁止 ● 出现在 I/O 脚上的数据在每个 APB2 时钟被采样到输入数据寄存器 ● 在开漏模式时对输入数据寄存器的读访问可得到 I/O 状态 ● 在推挽式模式时对输出数据寄存器的读访问得到最后一次写的值。 复用功能配置 当 I/O 端口被配置为复用功能时 ● 在开漏或推挽式配置中输出缓冲器被打开 ● 内置外设的信号驱动输出缓冲器 ( 复用功能输出 ) ● 施密特触发输入被激活 ● 弱上拉和下拉电阻被禁止 ● 在每个 APB2 时钟周期出现在 I/O 脚上的数据被采样到输入数据寄存器 ● 开漏模式时读输入数据寄存器时可得到 I/O 口状态 ● 在推挽模式时读输出数据寄存器时可得到最后一次写的值 模拟输入配置 当 I/O 端口被配置为模拟输入配置时 ● 输出缓冲器被禁止 ● 禁止施密特触发输入实现了每个模拟 I/O 引脚上的零消耗。施密特触发输出值被强置 为 ’0’ ● 弱上拉和下拉电阻被禁止 ● 读取输入数据寄存器时数值为 ’0’ 新建工程 电灯流程 配置RCC外设时钟 //点亮一个LED #include stm32f10x.h // Device headerint main(void) {//APB2 包括A 和B 的IO口并配置各种时钟分频器以生成所需的时钟频率RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//GPIO初始化类型 并配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//把初始化的放进来 输出的三种写法GPIO_Init(GPIOB,GPIO_InitStructure);//GPIOB拉低、拉高、在writeBit中拉高拉低GPIO_ResetBits(GPIOB,GPIO_Pin_5); //GPIO_SetBits(GPIOB,GPIO_Pin_5); //GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET); //GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);while(1){} }外设案例 LED流水灯 #include stm32f10x.h // Device header #include Delay.h int main(void) {//APB2 包括A 和B 的IO口并配置各种时钟分频器以生成所需的时钟频率RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//也可以同时用或初始化AB//GPIO初始化类型 并配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_All;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//推挽模式下 高低电平都有驱动能力点亮LED//GPIO_Mode_Out_OD 开漏输出 低电平才有驱动能力点灯 高电平没驱动能力GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//把初始化的放进来 输出的三种写法GPIO_Init(GPIOA,GPIO_InitStructure);while(1){GPIO_Write(GPIOA,~0x0001);//0000 0000 0000 0001 B1引脚低电平Delay_ms(500);GPIO_Write(GPIOA,~0x0002);//0000 0000 0000 0010 Delay_ms(500);GPIO_Write(GPIOA,~0x0004);//0000 0000 0000 0100Delay_ms(500);GPIO_Write(GPIOA,~0x0008);//0000 0000 0000 1000Delay_ms(500);// GPIO_Write(GPIOA,~0x0010);//0000 0000 0001 0000 // Delay_ms(500); // GPIO_Write(GPIOA,~0x0020);//0000 0000 0010 0000 // Delay_ms(500); // // GPIO_Write(GPIOA,~0x0040);//0000 0000 0100 0000 // Delay_ms(500); // GPIO_Write(GPIOA,~0x0080);//0000 0000 1000 0000 // Delay_ms(500);} }蜂鸣器 #include stm32f10x.h // Device header #include Delay.h int main(void) {//APB2 包括A 和B 的IO口并配置各种时钟分频器以生成所需的时钟频率RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//也可以同时用或初始化AB//GPIO初始化类型 并配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//推挽模式下 高低电平都有驱动能力点亮LEDGPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//把初始化的放进来 输出的三种写法GPIO_Init(GPIOA,GPIO_InitStructure);while(1){//这是因为GPIO_Write函数本身的作用是将PortVal参数的位设置为1GPIO_Write(GPIOA,~GPIO_Pin_8);//GPIO_Write默认设置为高电平Delay_ms(100);GPIO_Write(GPIOA,GPIO_Pin_8);Delay_ms(100);GPIO_Write(GPIOA,~GPIO_Pin_8);Delay_ms(100);GPIO_Write(GPIOA,GPIO_Pin_8);Delay_ms(700);// GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); // Delay_ms(100); // GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); // Delay_ms(100); // GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); // Delay_ms(100); // GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); // Delay_ms(700);} }上拉电阻和下拉电阻知识 电压比较器 c语言基础知识 类型、结构体、枚举 类型int8_t int16_t int32_t 宏替换 #define 和typedef用法    typedef相对于更加安全 关键字#define 用途用一个字符串代替一个数字便于理解防止出错提取程序中经常出现的参数            便于快速修改 定义宏定义    #define ABC 12345 引用宏定义     int a ABC;    //等效于int a 12345; 关键字typedef 用途将一个比较长的变量类型名换个名字便于使用 定义typedef     typedef unsigned char uint8_t; 引用typedef      uint8_t a;    //等效于unsigned char a;  结构体两种填充方法 和 命名规则 枚举用法 关键字enum 用途定义一个取值受限制的整型变量用于限制变量取值范围宏定义的集合 定义枚举变量     enum{FALSE 0, TRUE 1} EnumName;     因为枚举变量类型较长所以通常用typedef更改变量类型名 引用枚举成员     EnumName FALSE;     EnumName TRUE;  常用配置 输入输出模式 GPIOMode_TypeDef 枚举类型该枚举类型包含了多个枚举成员表示不同的 GPIO 模式。下面是对每个成员的中文注释 GPIO_Mode_AIN模拟输入模式GPIO_Mode_IN_FLOATING浮空输入模式GPIO_Mode_IPD下拉输入模式GPIO_Mode_IPU上拉输入模式GPIO_Mode_Out_OD开漏输出模式GPIO_Mode_Out_PP推挽输出模式GPIO_Mode_AF_OD复用开漏输出模式GPIO_Mode_AF_PP复用推挽输出模式 GPIO常用库函数 void GPIO_DeInit(GPIO_TypeDef* GPIOx)用于将指定GPIO端口的所有配置重置为默认值。 void GPIO_AFIODeInit(void)用于将AFIOAlternate Function I/O寄存器的配置重置为默认值。 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)用于初始化指定GPIO端口的引脚配置。通过GPIO_InitStruct结构体参数传递引脚相关配置如引脚编号、引脚模式、引脚速度、引脚上拉/下拉等。 void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)用于将GPIO_InitStruct结构体中的成员设置为默认值。   uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)用于读取指定GPIO端口指定引脚号的输入电平逻辑高或逻辑低。 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)用于读取指定GPIO端口的全部输入引脚的电平状态。 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)用于读取指定GPIO端口指定引脚号的输出电平逻辑高或逻辑低。 uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)用于读取指定GPIO端口的全部输出引脚的电平状态。   void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)用于将指定GPIO端口中指定引脚置为逻辑高电平。 void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)用于将指定GPIO端口中指定引脚置为逻辑低电平。 void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)用于设置指定GPIO端口中指定引脚的输出电平BitVal参数可设置为Bit_RESET低电平或Bit_SET高电平。 void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)用于设置指定GPIO端口的全部输出引脚的电平状态。PortVal参数是一个16位的数值每个位对应一个引脚可设置为逻辑低或逻辑高。   void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)用于锁定指定GPIO端口的指定引脚防止意外改变其配置。 void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)用于配置GPIO的事件输出功能将指定的GPIO端口和引脚映射到事件输出信号线上。 void GPIO_EventOutputCmd(FunctionalState NewState)用于使能或禁用GPIO的事件输出功能。 void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)用于重新映射GPIO端口的引脚将其连接到其他IO端口或功能。 void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)用于配置GPIO的外部中断线路将指定的GPIO端口和引脚映射到外部中断线上。 void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface)用于配置GPIO端口的以太网媒体接口MII或RMII。 中断函数 void EXTI_DeInit(void)用于将外部中断配置重置为默认值。 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)用于根据指定的配置参数初始化外部中断。 void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct)用于将外部中断配置结构体EXTI_InitStruct的成员设置为默认值。 void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)用于生成指定外部中断线的软件中断。可以用于模拟外部中断触发。 FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line)用于获取指定外部中断线的中断标志状态。返回值为SET中断标志置位或RESET中断标志未置位。 void EXTI_ClearFlag(uint32_t EXTI_Line)用于清除指定外部中断线的中断标志。将中断标志置位。 ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)用于获取指定外部中断线的中断状态。返回值为SET中断状态已触发或RESET中断状态未触发。 void EXTI_ClearITPendingBit(uint32_t EXTI_Line)用于清除指定外部中断线的中断挂起位。将中断挂起位复位。 模块化编程  延时函数  System #include stm32f10x.h/*** brief 微秒级延时* param xus 延时时长范围0~233015* retval 无*/ void Delay_us(uint32_t xus) {SysTick-LOAD 72 * xus; //设置定时器重装值SysTick-VAL 0x00; //清空当前计数值SysTick-CTRL 0x00000005; //设置时钟源为HCLK启动定时器while(!(SysTick-CTRL 0x00010000)); //等待计数到0SysTick-CTRL 0x00000004; //关闭定时器 }/*** brief 毫秒级延时* param xms 延时时长范围0~4294967295* retval 无*/ void Delay_ms(uint32_t xms) {while(xms--){Delay_us(1000);} }/*** brief 秒级延时* param xs 延时时长范围0~4294967295* retval 无*/ void Delay_s(uint32_t xs) {while(xs--){Delay_ms(1000);} } LED函数  Hardwore #include stm32f10x.h // Device header//LED初始化 void LED_Init(void) { //配置寄存器A时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//结构体名字 及配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//配置完初始化 初始化后灯会亮GPIO_Init(GPIOB,GPIO_InitStructure);//把该引脚拉高灯灭GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9); }//LED1 开 void LED1_ON(void) {GPIO_ResetBits(GPIOB,GPIO_Pin_8); } //LED1 关 void LED1_OFF(void) {GPIO_SetBits(GPIOB,GPIO_Pin_8); } //LED2 开 void LED2_ON(void) {GPIO_ResetBits(GPIOB,GPIO_Pin_9); } //LED2 关 void LED2_OFF(void) {GPIO_SetBits(GPIOB,GPIO_Pin_9); } //LED1按键反转 void LED1_Turn(void) { //如果是低电平正在亮就灭 拉高if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_8) 0){GPIO_SetBits(GPIOB,GPIO_Pin_8);}else{//否则就是熄灭状态 就拉低 灯亮GPIO_ResetBits(GPIOB,GPIO_Pin_8);} }void LED2_Turn(void) { //如果是低电平正在亮就灭 拉高if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_9) 0){GPIO_SetBits(GPIOB,GPIO_Pin_9);}else{//否则就是熄灭状态 就拉低 灯亮GPIO_ResetBits(GPIOB,GPIO_Pin_9);} } 按键函数  Hardwore #include stm32f10x.h // Device header #include Delay.h//按键 初始化 PA0 PA1 设置为上拉输入 void Key_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//上拉输入 看原理图GPIO_InitStructure.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure); }//获取按键值 注意返回类型uint8_t unsigned char GPIO_ReadInputDataBit读取一个位 返回0或1 uint8_t Key_getNum(void) {uint8_t keyNum 0;//如果按键1 按下 延时消抖 还是按下状态 消抖 keyNum赋值1if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) 0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) 0);Delay_ms(20);keyNum 1;}//如果按键2 按下 延时消抖 还是按下状态 消抖 keyNum赋值2if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) 0){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) 0);Delay_ms(20);keyNum 2;}return keyNum;} 蜂鸣器函数  Hardwore #include stm32f10x.h // Device header//蜂鸣器初始化 void Buzzer_Init(void) { //配置寄存器A时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//结构体名字 及配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//配置完初始化 初始化后灯会亮GPIO_Init(GPIOA,GPIO_InitStructure);//把该引脚拉高灯灭//GPIO_SetBits(GPIOA,GPIO_Pin_8); }//蜂鸣器 开 void Buzzer_ON(void) {GPIO_ResetBits(GPIOA,GPIO_Pin_8); } //蜂鸣器 关 void Buzzer_OFF(void) {GPIO_SetBits(GPIOA,GPIO_Pin_8); }//蜂鸣器 反转 void Buzzer_Turn(void) { //如果是低电平正在亮就灭 拉高if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8) 0){GPIO_SetBits(GPIOB,GPIO_Pin_8);}else{//否则就是熄灭状态 就拉低 灯亮GPIO_ResetBits(GPIOA,GPIO_Pin_8);} }震动模块 Hardwore 输入 #include stm32f10x.h // Device header//震动模块 初始化 PA4 设置为上拉输入 void Shock_Init() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//上拉输入 看原理图GPIO_InitStructure.GPIO_Pin GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure); }//获取震动传感器的值 有震动返回0 没有就是高 uint8_t Shock_getMsg() {return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);} OLED IIC模块Hardwore #include stm32f10x.h #include OLED_Font.h/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))/*引脚初始化*/ void OLED_I2C_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD;//开楼输出GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin GPIO_Pin_8;GPIO_Init(GPIOB, GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;GPIO_Init(GPIOB, GPIO_InitStructure);OLED_W_SCL(1);OLED_W_SDA(1); }/*** brief I2C开始* param 无* retval 无*/ void OLED_I2C_Start(void) {OLED_W_SDA(1);OLED_W_SCL(1);OLED_W_SDA(0);OLED_W_SCL(0); }/*** brief I2C停止* param 无* retval 无*/ void OLED_I2C_Stop(void) {OLED_W_SDA(0);OLED_W_SCL(1);OLED_W_SDA(1); }/*** brief I2C发送一个字节* param Byte 要发送的一个字节* retval 无*/ void OLED_I2C_SendByte(uint8_t Byte) {uint8_t i;for (i 0; i 8; i){OLED_W_SDA(Byte (0x80 i));OLED_W_SCL(1);OLED_W_SCL(0);}OLED_W_SCL(1); //额外的一个时钟不处理应答信号OLED_W_SCL(0); }/*** brief OLED写命令* param Command 要写入的命令* retval 无*/ void OLED_WriteCommand(uint8_t Command) {OLED_I2C_Start();OLED_I2C_SendByte(0x78); //从机地址OLED_I2C_SendByte(0x00); //写命令OLED_I2C_SendByte(Command); OLED_I2C_Stop(); }/*** brief OLED写数据* param Data 要写入的数据* retval 无*/ void OLED_WriteData(uint8_t Data) {OLED_I2C_Start();OLED_I2C_SendByte(0x78); //从机地址OLED_I2C_SendByte(0x40); //写数据OLED_I2C_SendByte(Data);OLED_I2C_Stop(); }/*** brief OLED设置光标位置* param Y 以左上角为原点向下方向的坐标范围0~7* param X 以左上角为原点向右方向的坐标范围0~127* retval 无*/ void OLED_SetCursor(uint8_t Y, uint8_t X) {OLED_WriteCommand(0xB0 | Y); //设置Y位置OLED_WriteCommand(0x10 | ((X 0xF0) 4)); //设置X位置高4位OLED_WriteCommand(0x00 | (X 0x0F)); //设置X位置低4位 }/*** brief OLED清屏* param 无* retval 无*/ void OLED_Clear(void) { uint8_t i, j;for (j 0; j 8; j){OLED_SetCursor(j, 0);for(i 0; i 128; i){OLED_WriteData(0x00);}} }/*** brief OLED显示一个字符* param Line 行位置范围1~4* param Column 列位置范围1~16* param Char 要显示的一个字符范围ASCII可见字符* retval 无*/ void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char) { uint8_t i;OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8); //设置光标位置在上半部分for (i 0; i 8; i){OLED_WriteData(OLED_F8x16[Char - ][i]); //显示上半部分内容}OLED_SetCursor((Line - 1) * 2 1, (Column - 1) * 8); //设置光标位置在下半部分for (i 0; i 8; i){OLED_WriteData(OLED_F8x16[Char - ][i 8]); //显示下半部分内容} }/*** brief OLED显示字符串* param Line 起始行位置范围1~4* param Column 起始列位置范围1~16* param String 要显示的字符串范围ASCII可见字符* retval 无*/ void OLED_ShowString(uint8_t Line, uint8_t Column, char *String) {uint8_t i;for (i 0; String[i] ! \0; i){OLED_ShowChar(Line, Column i, String[i]);} }/*** brief OLED次方函数* retval 返回值等于X的Y次方*/ uint32_t OLED_Pow(uint32_t X, uint32_t Y) {uint32_t Result 1;while (Y--){Result * X;}return Result; }/*** brief OLED显示数字十进制正数* param Line 起始行位置范围1~4* param Column 起始列位置范围1~16* param Number 要显示的数字范围0~4294967295* param Length 要显示数字的长度范围1~10* retval 无*/ void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) {uint8_t i;for (i 0; i Length; i) {OLED_ShowChar(Line, Column i, Number / OLED_Pow(10, Length - i - 1) % 10 0);} }/*** brief OLED显示数字十进制带符号数* param Line 起始行位置范围1~4* param Column 起始列位置范围1~16* param Number 要显示的数字范围-2147483648~2147483647* param Length 要显示数字的长度范围1~10* retval 无*/ void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length) {uint8_t i;uint32_t Number1;if (Number 0){OLED_ShowChar(Line, Column, );Number1 Number;}else{OLED_ShowChar(Line, Column, -);Number1 -Number;}for (i 0; i Length; i) {OLED_ShowChar(Line, Column i 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 0);} }/*** brief OLED显示数字十六进制正数* param Line 起始行位置范围1~4* param Column 起始列位置范围1~16* param Number 要显示的数字范围0~0xFFFFFFFF* param Length 要显示数字的长度范围1~8* retval 无*/ void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) {uint8_t i, SingleNumber;for (i 0; i Length; i) {SingleNumber Number / OLED_Pow(16, Length - i - 1) % 16;if (SingleNumber 10){OLED_ShowChar(Line, Column i, SingleNumber 0);}else{OLED_ShowChar(Line, Column i, SingleNumber - 10 A);}} }/*** brief OLED显示数字二进制正数* param Line 起始行位置范围1~4* param Column 起始列位置范围1~16* param Number 要显示的数字范围0~1111 1111 1111 1111* param Length 要显示数字的长度范围1~16* retval 无*/ void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length) {uint8_t i;for (i 0; i Length; i) {OLED_ShowChar(Line, Column i, Number / OLED_Pow(2, Length - i - 1) % 2 0);} }/*** brief OLED初始化* param 无* retval 无*/ void OLED_Init(void) {uint32_t i, j;for (i 0; i 1000; i) //上电延时{for (j 0; j 1000; j);}OLED_I2C_Init(); //端口初始化OLED_WriteCommand(0xAE); //关闭显示OLED_WriteCommand(0xD5); //设置显示时钟分频比/振荡器频率OLED_WriteCommand(0x80);OLED_WriteCommand(0xA8); //设置多路复用率OLED_WriteCommand(0x3F);OLED_WriteCommand(0xD3); //设置显示偏移OLED_WriteCommand(0x00);OLED_WriteCommand(0x40); //设置显示开始行OLED_WriteCommand(0xA1); //设置左右方向0xA1正常 0xA0左右反置OLED_WriteCommand(0xC8); //设置上下方向0xC8正常 0xC0上下反置OLED_WriteCommand(0xDA); //设置COM引脚硬件配置OLED_WriteCommand(0x12);OLED_WriteCommand(0x81); //设置对比度控制OLED_WriteCommand(0xCF);OLED_WriteCommand(0xD9); //设置预充电周期OLED_WriteCommand(0xF1);OLED_WriteCommand(0xDB); //设置VCOMH取消选择级别OLED_WriteCommand(0x30);OLED_WriteCommand(0xA4); //设置整个显示打开/关闭OLED_WriteCommand(0xA6); //设置正常/倒转显示OLED_WriteCommand(0x8D); //设置充电泵OLED_WriteCommand(0x14);OLED_WriteCommand(0xAF); //开启显示OLED_Clear(); //OLED清屏 }字库 #ifndef __OLED_FONT_H #define __OLED_FONT_H/*OLED字模库宽8像素高16像素*/ const uint8_t OLED_F8x16[][16] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 00x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 10x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 20x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 30x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 40xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 50x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,// 60x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 70x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 80x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 90x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 100x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,// 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 130x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 140x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 150x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 160x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 170x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 180x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 190x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 200x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 210x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 220x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 230x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 240x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 250x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 260x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 270x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,// 280x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,// 290x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,// 300x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 310xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,// 320x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 330x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 340xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 350x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 360x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 370x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 380xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 390x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 400x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 410x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 420x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 430x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 440x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 450x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 460xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 470x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 480xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 490x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 500x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 510x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 520x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 530x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 540xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 550x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 560x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 570x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 580x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 590x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 600x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 610x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 620x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 630x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 640x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 650x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 660x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 670x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 680x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 690x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 700x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 710x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 720x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 730x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 740x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 750x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 760x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 770x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 780x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 790x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 800x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 810x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 820x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 830x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 840x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 850x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 860x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 870x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 880x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 890x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 900x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 910x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 920x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 930x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94 };#endif调试方法 串口打印 、oled、 电灯、kile调试 通过各种现象调试 kile点击放大镜调试、板子实时在跑若要修改函数则需要先停止调试功能 中断系统 概念 中断在主程序运行过程中出现了特定的中断触发条件中断源使得CPU暂停当前正在运行的程序转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级当有多个中断源同时申请中断时CPU会根据中断源的轻重缓急进行裁决优先响应更加紧急的中断源 中断嵌套当一个中断程序正在运行时又有新的更高优先级的中断源申请中断CPU再次暂停当前中断程序转而去处理新的中断程序处理完成后依次进行返回 NVIC中断控制寄存器结构  NVIC分组 抢占优先级和响应优先级 中断配置 --代码----------------- 中断 oled刷新count的值 触发中断和触发事件  触发事件不会经过cpu直接反应事件 #include stm32f10x.h // Device headeruint16_t CountSensor_count; void CountSensor_Init(void) {//RCC 时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//GPIO初始化配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_14;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);//AFIO初始化配置 GPIO引脚到外部中断线的映射配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//EXTI初始化配置EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line EXTI_Line14;//中断线14EXTI_InitStructure.EXTI_LineCmd ENABLE;//使能EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt;//中断 另一个是事件EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling;//触发方式 上升沿 下降沿 上升下降沿都出触发EXTI_Init(EXTI_InitStructure);//指定GPIO端口和引脚映射到外部中断线上//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//用于配置中断优先级分组。中断优先级分组决定了中断优先级的划分方式NVIC_InitTypeDef NVIC_InitStructure; //结构体配置NVIC_InitStructure.NVIC_IRQChannel EXTI15_10_IRQn;//指定中断线NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;//响应中断优先级 0-14NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;//抢占中断优先级 0-14NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//开启NVIC_Init(NVIC_InitStructure);//初始化中断控制寄存器 }//返回count的值 uint16_t CountSensor_Get(void) {return CountSensor_count; }//10-15的中断处理函数 当发生中断就跳转到该函数 后要清楚中断标志位 void EXTI15_10_IRQHandler(void) { //检测是不是14引脚触发中断 SET触发中断if(EXTI_GetITStatus(EXTI_Line14) SET){//读取该引脚电平是否拉低 0 是countif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14) Bit_RESET){CountSensor_count;}EXTI_ClearITPendingBit(EXTI_Line14);} }/* 按键中断电灯 */ #include stm32f10x.h // Device header #include LED.h void CountSensor_Init(void) {//rcc 设置PPIOA时钟和复用口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//gpio afio配置GPIO和映射到复用口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1); //exti配置exti中断 EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line EXTI_Line0|EXTI_Line1;//中断映射pinEXTI_InitStructure.EXTI_LineCmd ENABLE;//使能开启中断EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt;//产生中断 还是事件EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling;//下降延触发EXTI_Init(EXTI_InitStructure);//NVIC_Prior 中断分组 5组 0 1 20-3抢占 0-3响应 3 4 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//nvic分组后初始化配置 两个角可以共用一个结构体NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel EXTI0_IRQn;//中断向量NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2;//抢占优先级 -- 根据分来来填写NVIC_InitStructure.NVIC_IRQChannelSubPriority 2;//响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//NVIC_Init(NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel EXTI1_IRQn;//中断向量NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2;//抢占优先级 -- 根据分来来填写NVIC_InitStructure.NVIC_IRQChannelSubPriority 3;//响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//NVIC_Init(NVIC_InitStructure);}//引脚0外部中断 void EXTI0_IRQHandler(void) {if(EXTI_GetITStatus(EXTI_Line0) SET){ //检测0是否按下LED1_ON(); //开灯EXTI_ClearITPendingBit(EXTI_Line0);//清除标志位} }//引脚1外部中断 void EXTI1_IRQHandler(void) {if(EXTI_GetITStatus(EXTI_Line1) SET){//检测0是否按下LED1_OFF(); //关灯EXTI_ClearITPendingBit(EXTI_Line1);//清除标志位} }#include stm32f10x.h // Device header #include Shock.h #include Buzzer.h #include Delay.h #include OLED.h #include CountSensor.hint main(void) {OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, Count:);while (1){OLED_ShowNum(1, 7, CountSensor_Get(),5);} } 两个中断时 #include stm32f10x.h // Device header int16_t Encoder_Count;void Encoder_Init(void) {//RCC 时钟配置RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//GPIO初始化配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1;//初始化引脚0 和 1GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);//AFIO初始化配置 GPIO引脚到外部中断线的映射配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//EXTI初始化配置EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line EXTI_Line0|EXTI_Line1;//中断线0 1映射EXTI_InitStructure.EXTI_LineCmd ENABLE;//使能EXTI_InitStructure.EXTI_Mode EXTI_Mode_Interrupt;//中断 另一个是事件EXTI_InitStructure.EXTI_Trigger EXTI_Trigger_Falling;//触发方式 上升沿 下降沿 上升下降沿都出触发EXTI_Init(EXTI_InitStructure);//指定GPIO端口和引脚映射到外部中断线上//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//用于配置中断优先级分组。中断优先级分组决定了中断优先级的划分方式NVIC_InitTypeDef NVIC_InitStructure; //结构体配置NVIC_InitStructure.NVIC_IRQChannel EXTI0_IRQn;//指定中断线NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;//响应中断优先级 0-14NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;//抢占中断优先级 0-14NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//开启NVIC_Init(NVIC_InitStructure);//初始化中断控制寄存器 引脚0NVIC_InitStructure.NVIC_IRQChannel EXTI1_IRQn;//指定中断线NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1;//响应中断优先级 0-14NVIC_InitStructure.NVIC_IRQChannelSubPriority 2;//抢占中断优先级 0-14NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//开启NVIC_Init(NVIC_InitStructure);//初始化中断控制寄存器 引脚1 }int16_t Encoder_Get(void) {int8_t temp;temp Encoder_Count;Encoder_Count 0;return temp; }//10-15的中断处理函数 当发生中断就跳转到该函数 后要清楚中断标志位 void EXTI0_IRQHandler(void) { //检测是不是14引脚触发中断 SET触发中断if(EXTI_GetITStatus(EXTI_Line0) SET){//读取该引脚电平是否拉低 0 是countif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) Bit_RESET){Encoder_Count--;}EXTI_ClearITPendingBit(EXTI_Line0);} }void EXTI1_IRQHandler(void) { //检测是不是14引脚触发中断 SET触发中断if(EXTI_GetITStatus(EXTI_Line1) SET){//读取该引脚电平是否拉低 0 是countif(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) Bit_RESET){Encoder_Count;}EXTI_ClearITPendingBit(EXTI_Line1);} }定时器 定时器类型 定时器时基----基本定时器 通用定时器时钟输入 高级定时器 代码部分----------------------------- 配置STM32F103C8T6标准库的定时器中断需要以下步骤 使能时钟。配置预分频、自动重装值和重复计数值。清除中断标志位否则会先进一次中断。使能TIM中断选择中断源。设置中断优先级。使能TIMx外设。 #include stm32f10x.h // Device headervoid Timer_Init() {//使能时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2); //用于配置TIMx定时器的时钟源和分频值//设置预分频自动重装值和重复计数 定时时间clk_psc/psc1/次数 72000000/7200-1/10000-1 1秒TIM_TimeBaseInitTypeDef TIM_TimBaseInitStructure;TIM_TimBaseInitStructure.TIM_Prescaler 7200 - 1; //设置定时器的预分频值TIM_TimBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数模式TIM_TimBaseInitStructure.TIM_Period 10000 - 1; //即定时器需要计数多少次才能溢出一次TIM_TimBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//置定时器的时钟分频系数为1即不分频。TIM_TimBaseInitStructure.TIM_RepetitionCounter 0; //设置定时器的重复计数器值为0用于启动定时器和计算定时器溢出时间。TIM_TimeBaseInit(TIM2,TIM_TimBaseInitStructure);//清除中断标志位TIM_ClearFlag(TIM2,TIM_FLAG_Update); //防止TIM_TimeBaseInit后就进入中断//使能TIM中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//设置中断优先级NVIC_InitTypeDef NVIV_InitStructure;NVIV_InitStructure.NVIC_IRQChannel TIM2_IRQn;//中断通道NVIV_InitStructure.NVIC_IRQChannelCmd ENABLE;//启动中断NVIV_InitStructure.NVIC_IRQChannelPreemptionPriority 2;//抢占优先级为2NVIV_InitStructure.NVIC_IRQChannelSubPriority 1; //响应优先级1NVIC_Init(NVIV_InitStructure);//中通道配置//使能TIMx外设TIM_Cmd(TIM2,ENABLE); //定时器2使能 }/* //定时器2中断 void TIM2_IRQHandler(void) {//判断是不是定时器2中断if(TIM_GetITStatus(TIM2,TIM_IT_Update) SET){//清楚标志位TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}} */定时器电灯。 /* 定时器中断点灯 */#include stm32f10x.h // Device header #include LED.h void Timer_Init(void) { //设置时钟挂在APB1时钟上 为内部时钟72MHzRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//配置时基 72000000/7200/10000 1sTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//几分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 10000-1;//周期TIM_TimeBaseInitStructure.TIM_Prescaler 7200-1;//psc获取定时器的预分频系数。这个参数决定了定时器的计数频率TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//设置重复计数值 溢出增加计数 高级定时器才能用TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//设置运行控制 当指定的更新事件通常是TIM_UpdateFlag发生时使能定时器的中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//设置中断控制分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断控制NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn;//中断通道NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//使能中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2;//抢占优先级 --根据分组NVIC_InitStructure.NVIC_IRQChannelSubPriority 2;//响应优先级NVIC_Init(NVIC_InitStructure);//启动定时器TIM_Cmd(TIM2,ENABLE);} void TIM2_IRQHandler(void) {if(TIM_GetITStatus(TIM2,TIM_IT_Update) SET){LED1_Turn();TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//用于清除定时器的某个中断挂起位的状态 以便重新激活} }定时器 ---- PWM 概念 原理图  常用模式 CNT和CCR以及满刻度占比  计算公式 电路接线图 引脚复用 ---- 映射 计算公式 PWM控制呼吸灯 ---------------- /* pwm.c pwm控制呼吸灯 */ #include stm32f10x.h // Device headervoid PWM_Init(void) {//1.1RCC时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//2.1rcc 设置PPIOA时钟和复用口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;//GPIO0配置为复用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//1.2定时器时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 100-1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 720-1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才需要设置TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//3.1用于初始化定时器TIM的输出比较通道1TIM_OC1的功能TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);//!!用于初始化定时器的输出比较通道Output Compare Channel结构体 防止高级定时器参数过多冲突TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1;//设置模式为PWM1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High;//高电平有效TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable;//PWM使能开启 TIM_OutputNState_EnableTIM_OCInitStructure.TIM_Pulse 0;//占空比百分之10TIM_OC1Init(TIM2,TIM_OCInitStructure);//定时器通道1PWM初始化//1.3启动定时器TIM_Cmd(TIM2,ENABLE);}//设置占空比 最后是1 不是L、l void PWM_SetCompare1(uint16_t Comparel) {TIM_SetCompare1(TIM2,Comparel);//作用是设置 PWM 输出的占空比 } /* PWM.h */ #ifndef _PWM_H #define _PWM_Hvoid PWM_Init(void); void PWM_SetCompare1(uint16_t Comparel);#endif/* main */ #include stm32f10x.h // Device header #include Shock.h #include Buzzer.h #include Delay.h #include OLED.h #include CountSensor.h #include LED.h #include Timer.h #include PWM.huint16_t i;int main(void) {OLED_Init();PWM_Init();while (1){for (i 0; i 100; i){PWM_SetCompare1(i);Delay_ms(10);}for (i 0; i 100; i){PWM_SetCompare1(100 - i);Delay_ms(10);}} } PWM控制SG90舵机---------------- 使用定时器2通道2 /* pwm.c pwm.h */ #include stm32f10x.h // Device headervoid PWM_Init(void) {//1.1RCC时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//1.2定时器时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 20000-1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 72-1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才需要设置TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//2.1rcc 设置PPIOA时钟和复用口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;//GPIO0配置为复用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; //第二通道对应PA1GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//3.1用于初始化定时器TIM的输出比较通道1TIM_OC2的功能TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);//!!用于初始化定时器的输出比较通道Output Compare Channel结构体TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1;//设置模式为PWM1TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable;//PWM使能开启TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High;//高电平有效TIM_OCInitStructure.TIM_Pulse 0;//占空比百分之10TIM_OC2Init(TIM2,TIM_OCInitStructure);//----用的定时器2通道 共用CNT寄存器 不同通道设置不同ARR//1.3启动定时器TIM_Cmd(TIM2,ENABLE);}//设置占空比 用的定时器通道2 接的SG90 void PWM_SetCompare2(uint16_t Compare) {TIM_SetCompare2(TIM2,Compare);//作用是设置 PWM 输出的占空比 } #ifndef _PWM_H #define _PWM_Hvoid PWM_Init(void); void PWM_SetCompare2(uint16_t Compare);#endifSG90.c /* sg90.c */ #include stm32f10x.h // Device header #include PWM.h//SG90通过PWM初始化成0度 void SG90_Init(void) {PWM_Init();PWM_SetCompare2(500); }//设置角度 void SG90_SetAngle(uint16_t angle) {PWM_SetCompare2(angle/180*2000 500);//2500占空比 180度2500/20000 }/* sg90.h */#ifndef _SG90_H #define _SG90_H//SG90通过PWM初始化成0度 void SG90_Init(void); //设置角度 void SG90_SetAngle(uint16_t angle);#endifPWM驱动电机模块 /* pwm.c */#include stm32f10x.h // Device headervoid PWM_Init(void) {//1.1RCC时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//1.2定时器时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 20000-1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 72-1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才需要设置TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//2.1rcc 设置PPIOA时钟和复用口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;//GPIO0配置为复用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_2; //定时器第三通道对应PA2GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//3.1用于初始化定时器TIM的输出比较通道1TIM_OC2的功能TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);//!!用于初始化定时器的输出比较通道Output Compare Channel结构体TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1;//设置模式为PWM1TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable;//PWM使能开启TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High;//高电平有效TIM_OCInitStructure.TIM_Pulse 0;//占空比百分之10TIM_OC2Init(TIM2,TIM_OCInitStructure);//----用的定时器2通道 共用CNT寄存器 不同通道设置不同ARR//1.3启动定时器TIM_Cmd(TIM2,ENABLE);}//设置占空比 用的定时器通道3 接的PA2 电机模块 void PWM_SetCompare3(int16_t Compare) {TIM_SetCompare3(TIM2,Compare);//作用是设置 PWM 输出的占空比 }/* Motor.c 电机模块 三根线 正反转PA4 PA5 pwm接PA2定时器2通道3 */#include stm32f10x.h // Device header #include PWM.h//电机初始化一个接PA4 一个接PA5 一个PWM接PA2 void Motor_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//上拉输入 看原理图GPIO_InitStructure.GPIO_Pin GPIO_Pin_4|GPIO_Pin_5;//接电机正负级GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//电机初始化PWM_Init();}//设置电机速度、一高一低控制方向、pwm控制速度 void Motor_SetSpeed(int16_t Speed) {if(Speed 0){GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(Speed);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_4);GPIO_SetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(-Speed);} }输入捕获测频率 /* pwm */ #include stm32f10x.h // Device headervoid PWM_Init(void) {//1.1RCC时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//2.1rcc 设置PPIOA时钟和复用口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;//GPIO0配置为复用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//1.2定时器时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 100-1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 720-1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才需要设置TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//3.1用于初始化定时器TIM的输出比较通道1TIM_OC1的功能TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);//!!用于初始化定时器的输出比较通道Output Compare Channel结构体 防止高级定时器参数过多冲突TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1;//设置模式为PWM1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High;//高电平有效TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable;//PWM使能开启 TIM_OutputNState_EnableTIM_OCInitStructure.TIM_Pulse 0;//占空比百分之10TIM_OC1Init(TIM2,TIM_OCInitStructure);//定时器通道1PWM初始化//1.3启动定时器TIM_Cmd(TIM2,ENABLE);}//设置占空比 最后是1 不是L、l void PWM_SetCompare1(uint16_t Comparel) {TIM_SetCompare1(TIM2,Comparel);//作用是设置 PWM 输出的占空比 }//设置PWM的预分频器Perscaler //允许在运行时修改预分频器的值而无需重新初始化整个定时器 //参数 TIM2 预分频 TIM_PSCReloadMode_Immediate立即重装载 void PWM_SetPrescaler(uint16_t Perscaler) {TIM_PrescalerConfig(TIM2,Perscaler,TIM_PSCReloadMode_Immediate); } /* ic输入捕获 */#include stm32f10x.h // Device header//输入捕获 //PA0发送占空比为50 预分频720的信号到PA6 PA6设置输入捕获获取PA0的频率并显示 void IC_Init(void) {//RCCRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_InternalClockConfig(TIM3);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时基TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 65536 - 1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才有TIM_TimeBaseInit(TIM3,TIM_TimeBaseInitStructure);//GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin GPIO_Pin_6;//PA6GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//频率为50嘛MHzGPIO_Init(GPIOA,GPIO_InitStructure);//输入捕获单元 用于初始化捕获通道、滤波器、捕获极性、映射关系和分频系数等参数TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel TIM_Channel_1;//通道TIM_ICInitStructure.TIM_ICFilter 0xF; //滤波器滤除干扰 越大越好TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising;//极性 上升沿触发TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; //不分频TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI;//直连输入 交叉输入TIM_ICInit(TIM3,TIM_ICInitStructure);//触发源 定时器3 通过TI1端PA6作为外部触发输入引脚的第1个边沿检测输入TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//从模式用于选择定时器的从模式 复位从模式TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//开启定时器TIM_Cmd(TIM3,ENABLE); }//获取频率 uint32_t IC_GetFreq(void) {//fx fc/N return 1000000 / (TIM_GetCapture1(TIM3) 1);//N10000 72MHz/720 TIM_GetCapture1获取定时器3捕获通道1的值 }#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include PWM.h #include IC.hint main(void) {OLED_Init();PWM_Init();IC_Init();OLED_ShowString(1,1,Freq:00000Hz);PWM_SetPrescaler(72 - 1);//设置预分频系数 Freq 72MHz/psc1/ARR1 10000 PSC 72000000/(psc1)/100PWM_SetCompare1(50);//设置占空比 Duty CCR/100;while (1){OLED_ShowNum(1,6,IC_GetFreq(),5);} } 输入捕获测占空比 #include stm32f10x.h // Device headervoid PWM_Init(void) {//1.1RCC时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//2.1rcc 设置PPIOA时钟和复用口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;//GPIO0配置为复用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//1.2定时器时基初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 100-1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 720-1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才需要设置TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//3.1用于初始化定时器TIM的输出比较通道1TIM_OC1的功能TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure);//!!用于初始化定时器的输出比较通道Output Compare Channel结构体 防止高级定时器参数过多冲突TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1;//设置模式为PWM1TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High;//高电平有效TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable;//PWM使能开启 TIM_OutputNState_EnableTIM_OCInitStructure.TIM_Pulse 0;//占空比百分之10TIM_OC1Init(TIM2,TIM_OCInitStructure);//定时器通道1PWM初始化//1.3启动定时器TIM_Cmd(TIM2,ENABLE);}//设置占空比 最后是1 不是L、l void PWM_SetCompare1(uint16_t Comparel) {TIM_SetCompare1(TIM2,Comparel);//作用是设置 PWM 输出的占空比 }//设置PWM的预分频器Perscaler //允许在运行时修改预分频器的值而无需重新初始化整个定时器 //参数 TIM2 预分频 TIM_PSCReloadMode_Immediate立即重装载 void PWM_SetPrescaler(uint16_t Perscaler) {TIM_PrescalerConfig(TIM2,Perscaler,TIM_PSCReloadMode_Immediate); } #include stm32f10x.h // Device header//输入捕获 //PA0发送占空比为50 预分频720的信号到PA6 PA6设置输入捕获获取PA0的频率并显示 void IC_Init(void) {//RCCRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_InternalClockConfig(TIM3);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时基TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 65536 - 1;//计数周期TIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1;//psc预分频TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//高级定时器才有TIM_TimeBaseInit(TIM3,TIM_TimeBaseInitStructure);//GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin GPIO_Pin_6;//PA6GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//频率为50嘛MHzGPIO_Init(GPIOA,GPIO_InitStructure);//输入捕获单元 用于初始化捕获通道、滤波器、捕获极性、映射关系和分频系数等参数TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel TIM_Channel_1;//通道TIM_ICInitStructure.TIM_ICFilter 0xF; //滤波器滤除干扰 越大越好TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising;//极性 上升沿触发TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; //不分频TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI;//直连输入 交叉输入TIM_PWMIConfig(TIM3,TIM_ICInitStructure);//~~~~!!!!!配置与前面的相反 通道2 下降沿 不分频 交叉输入TIM_ICInit(TIM3,TIM_ICInitStructure);//触发源 定时器3 通过TI1端PA6作为外部触发输入引脚的第1个边沿检测输入TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);//从模式用于选择定时器的从模式 复位从模式TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);//开启定时器TIM_Cmd(TIM3,ENABLE); }//获取频率 两个一样的标准72频率 占周期N的分之一 uint32_t IC_GetFreq(void) {//fx fc/N 一格/N格 即周期分之一 就是频率return 1000000 / (TIM_GetCapture1(TIM3) 1);//N100000 72MHz/720 TIM_GetCapture1获取定时器3捕获通道1的值 } //TIM_GetCapture1捕获的是计数器的值。当定时器溢出时计数器的值会被自动重置为0//获取占空比 uint32_t IC_GetDuty(void) {//获取通道2的N的次数单次 总的次数放在通道1中计数 return (TIM_GetCapture2(TIM3) * 100) / (TIM_GetCapture1(TIM3) 1); }#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include PWM.h #include IC.hint main(void) {OLED_Init();PWM_Init();IC_Init();OLED_ShowString(1,1,Freq:00000Hz);OLED_ShowString(2,1,Duty:00%);PWM_SetPrescaler(7200 - 1);//设置预分频系数 Freq 72MHz/psc1/ARR1 10000 PSC 72000000/(psc1)/100PWM_SetCompare1(80);//设置占空比 Duty CCR/100;while (1){OLED_ShowNum(1,6,IC_GetFreq(),5);OLED_ShowNum(2,6,IC_GetDuty(),2);} } 输入捕获编码器计数 TIM_EncoderInterfaceConfig 是一个用于配置定时器编码器接口参数的函数。这个函数通常在STM32微控制器编程中使用用于设置定时器的编码器模式、分辨率等参数。 函数原型 c复制代码 void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t EncoderMode, uint16_t IC1Filter, uint16_t IC1Polarity, uint16_t IC1Selection, uint16_t IC2Filter, uint16_t IC2Polarity, uint16_t IC2Selection); 参数 TIMx定时器模块的实例可以是 TIM2、TIM3、TIM4、TIM5 等。EncoderMode编码器模式可以是 TIM_EncoderMode_TI12、TIM_EncoderMode_TI1、TIM_EncoderMode_TI2 或 TIM_EncoderMode_TI4。IC1Filter输入滤波器1的值用于设置输入信号的滤波程度。IC1Polarity输入极性1的值用于设置输入信号的极性。IC1Selection输入选择1的值用于选择输入通道。IC2Filter输入滤波器2的值用于设置输入信号的滤波程度。IC2Polarity输入极性2的值用于设置输入信号的极性。IC2Selection输入选择2的值用于选择输入通道。 #include stm32f10x.h // Device header//编码器配置 void Encoder_Init(void) {//RCC时钟配置RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_InternalClockConfig(TIM3);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时基 使用定时器3 因为定时器2到普通时钟了TIM_TimeBaseInitTypeDef TIM_TimeBaseIniitStructure;TIM_TimeBaseIniitStructure.TIM_ClockDivision TIM_CKD_DIV1;//预分频因子 不分频TIM_TimeBaseIniitStructure.TIM_CounterMode TIM_CounterMode_Up;//定时器模式为向上计数TIM_TimeBaseIniitStructure.TIM_Period 65536-1;//计数周期为16为寄存器挤满65536TIM_TimeBaseIniitStructure.TIM_Prescaler 1-1;//不分频TIM_TimeBaseIniitStructure.TIM_RepetitionCounter 0;//高级定时器才有TIM_TimeBaseInit(TIM3,TIM_TimeBaseIniitStructure);//GPIO初始化配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;//引脚模式为上拉输入GPIO_InitStructure.GPIO_Pin GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);//PWM输入捕获配置TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICStructInit(TIM_ICInitStructure);//参数过多没有配置 放入结构体中防止冲突TIM_ICInitStructure.TIM_Channel TIM_Channel_1;//输入捕获 定时器通道1TIM_ICInitStructure.TIM_ICFilter 0xF;//滤波器越大越好TIM_ICInit(TIM3,TIM_ICInitStructure);//配置完输入捕获通道1 写入寄存器中TIM_ICInitStructure.TIM_Channel TIM_Channel_2;//输入捕获 定时器通道2TIM_ICInitStructure.TIM_ICFilter 0xF;//滤波器越大越好TIM_ICInit(TIM3,TIM_ICInitStructure);//配置完输入捕获通道2 写入寄存器中//Encoder配置 里面极性TIM_ICPolarity_Rising 会覆盖输入捕获中的极性 必须在后面 前面极性可省略TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//开启时钟TIM_Cmd(TIM3,ENABLE);}//获取count值 int16_t Encoder_Get(void) {int16_t Temp;Temp TIM_GetCounter(TIM3);//用于获取定时器计数器的函数TIM_SetCounter(TIM3,0); //用于设置定时器计数器的函数return Temp; } #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include PWM.h #include Timer.h #include Encoder.hint16_t Speed;int main(void) {OLED_Init();PWM_Init();Encoder_Init();Timer_Init();OLED_ShowString(1,1,Speed:);while (1){OLED_ShowSignedNum(1,7,Speed,5);} }void TIM2_IRQHandler(void)//每秒钟获取以下speed速度 {if(TIM_GetITStatus(TIM2,TIM_IT_Update) SET){Speed Encoder_Get();TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//用于清除定时器的某个中断挂起位的状态 以便重新激活} } /* 定时器 */ #include stm32f10x.h // Device header #include LED.h void Timer_Init(void) { //设置时钟挂在APB1时钟上 为内部时钟72MHzRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);//配置时基 72000000/7200/10000 1sTIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//几分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period 10000-1;//周期TIM_TimeBaseInitStructure.TIM_Prescaler 7200-1;//psc获取定时器的预分频系数。这个参数决定了定时器的计数频率TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;//设置重复计数值 溢出增加计数 高级定时器才能用TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);//设置运行控制 当指定的更新事件通常是TIM_UpdateFlag发生时使能定时器的中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//设置中断控制分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断控制NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn;//中断通道NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//使能中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2;//抢占优先级 --根据分组NVIC_InitStructure.NVIC_IRQChannelSubPriority 2;//响应优先级NVIC_Init(NVIC_InitStructure);//启动定时器TIM_Cmd(TIM2,ENABLE);} //void TIM2_IRQHandler(void) 是否在主函数中调用了 //{ // if(TIM_GetITStatus(TIM2,TIM_IT_Update) SET) // { // LED1_Turn(); // TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//用于清除定时器的某个中断挂起位的状态 以便重新激活 // } //}
http://www.sadfv.cn/news/85639/

相关文章:

  • 上海企业建设网站价格专门做超市海报的网站
  • 机关网站制度建设山东网页定制
  • 可以做网站帮企业做网站
  • 做全房订制网站公司兰州迅豹网络怎么样
  • 外国人做数学视频网站淘宝主图制作
  • wordpress使用第三方播放器抖音seo怎么收费
  • 平稳有序推进网站建设wordpress口塞
  • 想建一个免费的网站iis6.0新发布网站访问速度慢
  • 自贡市建设局网站网站建设设
  • 鞍山高新区网站京东企业门户
  • 单页营销网站怎么做系统管理在哪里
  • 怎样建个网站金华企业网站建站模板
  • 汕头专业的免费建站北京手机网站建设公司哪家好
  • 南京网站备案广告公司照片
  • 哈尔滨seo优化效果东莞网站seo优化托管
  • 拍拍网的网站建设各类网站建设
  • 珠海斗门网站建设wordpress4性能
  • 中文wordpress网站前端学习路线
  • 湘潭做网站 磐石网络很专业网站百度搜不到了
  • 读经典做临床报名网站wordpress的ftp設置
  • 如何做网站弹窗广告淘宝推广工具
  • 巴彦淖尔网站建设公司企业网站代建设
  • 自建网站成都苍溪建设局网站
  • 怎样做seo网站推广网站建设情况的报告
  • 程序员自己做网站怎么能来钱白云网站开发
  • 网站开发系统搭建静态网站seo怎么做
  • 建设项目网站备案申请表要基于wordpress开发
  • 网站设计费 建设费入什么科目网站建设与管理心得体会和总结
  • 关于网站开发的学校百讯科技网站建设
  • 广西东晋建设有限公司网站微信手机网站app制作