1、GPIO_ResetBits(GPIOF,GPIO_Pin_8);5.主函数程序:int main(void) RCC_Configuration(); /* 配置系统时钟 */ GPIO_Configuration(); /* 配置GPIO IO口初始化 */ for(;) GPIOF-ODR = 0xfeff; /* PF8=0 - 点亮D3 */ Delay(600000);ODR = 0xffff; /* PF8=1 - 熄灭D3 */ 4、实验现象下载程序后开发板上的LED1灯闪烁5、总结通过对本实验可以发现,和51等8位单片机相比,STM32对I/O端口的操作变得复杂了许多。51单
2、片机点灯的程序最简单,直接在main()中写一个while(1),里面写4行代码就可以了。STM32进入while(1)之前必须先配置I/O的方向,必须使能外设的时钟。对STM32来说,除了CM3内核都算外设,包括GPIO。STM32可以关闭任何外设的时钟以禁止该外设,这样设计是出于减少功耗的考虑。实验二:流水灯的闪烁 一、实验要求1、熟悉使用STM32F103ZET6开发板2、利用C语言程序实现流水灯的闪烁实验二、电路原理图图1-2 流水灯硬件连接图三、软件分析1.本实验用到以下4个库函数(省略了参数):GPIO_WriteBit();3个自定义函数LED LED1(); LED2(); L
3、ED3();6.LED1实现所有灯从led1到led5依次点亮再全部熄灭,然后全部点亮,再全部熄灭的过程;LED2实现所有灯从led5到led1依次点亮的过程;LED3实现所有灯从led5到led1依次熄灭,点亮1、3、5灯,然后全部点亮,再全部熄灭的过程;四、实验现象下载程序后开发板上的LED所有灯从led1到led5依次点亮再全部熄灭,然后全部点亮,再全部熄灭,从led5到led1依次点亮,所有灯从led5到led1依次熄灭,点亮1、3、5灯,然后全部点亮,再全部熄灭。五、总结通过代码分析发现,使用固件库函数可以大大简化编程工作,我们可以依葫芦画瓢,很容易修改成自己想要的功能代码。对相关寄
4、存器的深入了解,可以使我们对各种外设功能有更深刻、更具体的掌握,使用起来也更得心应手。实验三:单级外部中断 1.利用C语言程序实现按下SW3, LED5闪烁20次单级外部中断实验2.通过实验掌握外部中断的编程方法1-3 外部中断连接图外部中断要经过3个部分模块设置处理,然后才进入到中断服务程序的处理,其框图如下:1-4 中断处理模块框图外部中断:GPIO输入中断虽然有16个输入通道,但是只占用了7个中断向量。EXTI0EXTI4各占用一个中断向量,EXTI59共用一个,EXTI1015共用一个。所以在编程的时候EXTI59将共用一个中断函数,EXTI1015共用一个中断函数。3.本实验用到以下
5、6个库函数(省略了参数):EXTI_InitTypeDef();NVIC_PriorityGroupConfig()4.配置输入的时钟:5.声明GPIO结构:6.应用GPIO口:配置:引脚选择: GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3);清除中断标志位:EXTI_ClearITPendingBit(EXTI_Line8)设置外部中断结构体的成员: = EXTI_Mode_Interrupt; = EXTI_Trigger_Falling; = ENABLE;EXTI_Init(&EXTI_InitStructure);分
6、为四个部分,分别针对中断线0到中断线3,结构相同。NVIC_PriorityGroupConfig()函数配置占先优先级和副优先级9.主函数程序:int main() /* 配置系统时钟 */ NVIC_Configuration(); /* IO口初始化 */ EXTI_Configuration(); GPIO_Write(GPIOF,0xffff); /* 全灭 */ Delay(5000); while(1) 每按下一次SW3,LED5闪烁20次,实现单级中断通过实验,我们学习了如何使用STM32的GPIO外部中断功能。GPIO外部中断使用方法比较容易掌握,只要沿着中断信号线一路设置遇
7、到的寄存器,最后编写中断服务程序即可,当然还要设置中断优先级。实验四:中断嵌套 1.利用C语言程序实现中断嵌套实验按下SW3, LED5闪烁20次 SW3 - PA0 LED5 - PF10 中断优先级为1;按下SW2, LED3闪烁20次 SW2 - PD3 LED3 - PF8 中断优先级为2; 按下SW1, LED1闪烁20次 SW1 - PA8 LED1 - PF6 中断优先级为3; 按下SW5, LED4闪烁20次 SW5 - PC13 LED4 - PF9 中断优先级为41.配置输入的时钟:2.声明GPIO结构:7.应用GPIO口:图1-5 多级中断硬件连接图8.NVIC配置:优先
8、级组都设为 2,PC13 中断主次优先级分别为4;PA8 主次优先级分别为3;PD3主次优先级分别为2;PA0 主次优先级分别为1;要求先进入 PC13 中断,执行某一个任务,突然 PA8 打断 PC13 的中断,转而进行 PA8的中断。PC13 的中断任务执行完毕,返回到 PC13中断继续原来的中断任务。突然 PD3 打断 PA8 的中断,转而进行 PD3的中断。PD3 的中断任务执行完毕,返回到 PA8中断继续原来的中断任务,以此推类。 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 函数程序: while(1)按下SW3, LED5闪烁20
9、次,闪烁过程中因为其中断优先级为1,所以除了复位按键其他按键不能打断LED5的亮灯情况;按下SW2, LED3闪烁20次,因为中断优先级为2,SW3可以使LED3闪烁停止而其他按键不能;按下SW1, LED1闪烁20次; 按下SW5, LED4闪烁20次,中断优先级为4通过实验,我们学习了如何使用STM32的GPIO外部中断功能和中断嵌套的编程。GPIO外部中断使用方法比较容易掌握,设置中断优先级时中断优先级越高,设置的数字应该越小。实验五:TIM2的基本应用 1.利用C语言程序实现用通用定时器TIM2中断控制LED的闪烁2.通过实验掌握定时器的编程方法二、软件分析的通用定时器:STM32的通
10、用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。STM32有4个通用定时器(TIM2、TIM3、TIM4、TIM5),它们适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。 void TIM2_Init(void) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 函数程序:int main() /* 配置GPIO I/O口初始化 */ /* 配置NVIC */ TIM_Configuration(); /* 配置TIMs
11、*/ while(1);三、实验现象TIM2使LED1灯以1S的周期闪烁,单次定时时间为100*10-6S四、总结通过实验,我们学习了如何使用STM32的通用定时器功能。通用定时器的溢出时间计算:使用通用定时器的最简单功能,就是定时,把计数器单元也当作一个分配器,时钟信号经过预分频器和计数器两级分频后,出来的信号就是溢出中断信号。所以溢出中断频率由以下式子确定:定时时间为:T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK实验六:TIM2,TIM3,TIM4多定时器的应用 1. 利用C语言程序实现TIM定时器多级中断2. 通过实验掌握定时器的编程方法2、软件分
12、析预分频器计数器自动装载寄存器CK_CNTCK_PSC PF6PF10口配置为输出、应用GPIO口3.EXTI配置:4.NVIC配置:5.TIM配置:使用定时器,就必须使能定时器的时 钟 , 这 就 是 函 数 RCC_APB1PeriphClockCmd(); , 通 过 它 开 启RCC_APB1Periph_TIM2TIM_DeInit( TIM2); 该函数主要用于复位 TIM2 定时器,使之进入初始状态。然后我们对自动重装载寄存器赋值,TIM_Period 的大小实际上表示的是需要经过 TIM_Period 次计数后才会发生一次更新或中断。 TIM_OCInitTypeDef TIM
13、_OCInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* TIM2 configuration 通道1:输出比较模式 */ = 1999; /自动重装载寄存器的值 =35999;/时钟预分频数 = 0;/采样分频 = TIM_CounterMode_Up; /向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_PrescalerConfig(TIM2, 7199, TIM_PSCReloadMode_Immediate); TIM_OC1Init(TIM2
14、, &TIM_OCInitStructure); = TIM_OCMode_Timing; = TIM_OutputState_Enable; = 0x0; = TIM_OCPolarity_High; TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); /* TIM3 configuration Output Compare Timing Mode configuration: Channel1 */ = 3999; TIM_TimeBaseInit(TIM3, & TIM_OC1Init(TIM3, & /* TIM4 configurat
15、ion Output Compare Timing Mode configuration: = 5999; TIM_TimeBaseInit(TIM4, & TIM_OC1Init(TIM4, & TIM_Cmd(TIM2, ENABLE); /* TIM2 enable counter */ TIM_Cmd(TIM3, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM4, ENABLE); /* TIM4 enable counter */ TIM_PrescalerConfig(TIM2, 20000, TIM_PSCReloadMode_Imm
16、ediate); TIM_PrescalerConfig(TIM3, 30000, TIM_PSCReloadMode_Immediate); TIM_PrescalerConfig(TIM4, 40000, TIM_PSCReloadMode_Immediate); TIM_ClearFlag(TIM2, TIM_FLAG_Update); /清除TIM2溢出中断 TIM_ClearFlag(TIM3, TIM_FLAG_Update); /清除TIM3溢出中断标志TIM_ClearFlag(TIM4, TIM_FLAG_Update); /清除TIM4溢出中断标志 TIM_ITConfig
17、(TIM2, TIM_IT_Update, ENABLE);/使能中断TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /使能中断TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); /使能中断LED1、LED3、LED5分别以、1s、2s的频率闪烁实验七:串口USART1读取CPU的ID号 1.利用C语言程序实现串口USART1读取CPU的ID号2.通过实验掌握串口USART1的编程方法1-6 串口硬件连接图1.用查询方式使用STM32的串口发送数据的基本程序流程是:打开复用功能、串口1的时钟;设置TXD、RXD引脚工作模式
18、;设置波特率、数据位数、停止位数、奇偶校验位等; 使能串口;发送数据;等待直到数据发送完成;清除发送完成标志。2.在RCC_Configuration()函数的GPIO_Init()函数的加一个函数main函数改为如下内容: /* 配置系统时钟 */ /* IO口初始化 */ USART_Configuration(); /* to get the chipid and put it in ChipUniqueID3 ,printf the chipid */ Get_ChipID(); /* printf the flash memory amount */ printf(rn芯片的唯一ID为: %X-%X-%Xrn,ChipUniqueID0,ChipUniqueID1,ChipUniqueID2); printf(rn芯片flash的容量为: %dK rn, *( u16 *)(0X1FFFF
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1