4实验现象Word格式.docx
《4实验现象Word格式.docx》由会员分享,可在线阅读,更多相关《4实验现象Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
for(;
;
)
{
GPIOF->
ODR=0xfcff;
/*PF8=0-->
点亮D3*/
Delay(1000000);
ODR=0xffff;
/*PF8=1-->
熄灭D3*/
4、实验现象
通过对GPIOF8的操作,可以使LED3闪烁
5、实验总结
这是第一次使用STM32开发板,主要内容是对IO端口进行配置,点亮与IO端口相连接的LED灯,闪烁周期为2S。
通过本实验对STM32开发板的硬件原理有了初步了解。
实验二:
流水灯
实现PF6-10端口所连接的5个LED灯顺次亮灭
图1流水灯硬件连接图
intmain(void)
{
RCC_Configuration();
/*配置系统时钟*/
/*配置GPIOIO口初始化*/
for(;
{
GPIOF->
ODR=0xffbf;
/*PF6=0-->
点亮LED1*/
Delay(5000000);
ODR=0xff7f;
/*PF7=0-->
点亮LED2*/
ODR=0xfeff;
/*PF8=0-->
点亮LED3*/
ODR=0xfdff;
/*PF9=0-->
点亮LED4*/
ODR=0xfbff;
/*PF10=0-->
点亮LED5*/
}
}
LED1~LED5依次点亮,亮灭的时间间隔都为1S。
本次实验对STM32开发板的GPIO端口进行进一步学习,通过程序可以实现流水灯的闪烁。
实验三:
单级外部中断
按下某个按键,触发中断,中断服务程序改变LED灯状态
图3SW1硬件原理图
intmain()
/*配置系统时钟*/
/*IO口初始化*/
GPIO_Write(GPIOF,0xffff);
/*全灭*/
Delay(5000);
while
(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0)/*如果SW1PA8=0*/
GPIO_SetBits(GPIOF,GPIO_Pin_6);
/*LED1点亮*/
Delay(0x1FFFFF);
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
/*LED1熄灭*/Delay(0x1FFFFF);
}
原来5个LED灯都处于熄灭状态,按下SW1,触发中断程序,LED1点亮。
通过本次实验,可以对某一状态通过外部中断,改变其当前状态。
实验四:
多中断嵌套
图4SW1,SW2,SW3硬件原理图
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQChannel;
//设定中断源为PA0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
//中断占优先级为0
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQChannel;
//设定中断源为PD3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
//中断占优先级为1
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQChannel;
//设定中断源为PA8
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
//中断占优先级为2
voidEXTI0_IRQHandler(void)
inti=0;
if(EXTI_GetITStatus(EXTI_Line0)!
=RESET)
for(i=0;
i<
10;
i++)
{
GPIO_Write(GPIOF,0xffff);
GPIO_SetBits(GPIOF,GPIO_Pin_6);
/*LED1点亮*/
Delay(0x5fFFFF);
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
/*LED1熄灭*/
EXTI_ClearITPendingBit(EXTI_Line0);
}}}
voidEXTI3_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line3)!
GPIO_SetBits(GPIOF,GPIO_Pin_7);
/*LED2点亮*/
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
/*LED2熄灭*/
EXTI_ClearITPendingBit(EXTI_Line3);
voidEXTI9_5_IRQHandler(void)
if(EXTI_GetITStatus(EXTI_Line8)!
GPIO_SetBits(GPIOF,GPIO_Pin_8);
/*LED3点亮*/
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
/*LED3熄灭*/
EXTI_ClearITPendingBit(EXTI_Line8);
中断优先级从高到低依次为:
SW3,SW2,SW1
原来5个LED灯都处于熄灭状态,按下SW1,LED3应该闪烁10次,当其闪烁5次后按下SW2,LED2也应该闪烁10次,当其闪烁4次后按下SW3,LED1也应该闪烁10次,则当LED1闪烁完10次后,LED2继续闪烁6次,之后LED1继续闪烁5次。
通过本次实验,可以对LED状态实行中断嵌套,由以上实验现象,得出以下结论:
高中断优先级可以打断低优先级,中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,反之,低中断优先级不可以打断高优先级。
实验五:
TIM2的基本应用
TIM2定时器将LED灯定时点亮和熄灭一定的时间
TIM_Cmd(TIM2,ENABLE);
/*TIM2enablecounter*/
TIM_TimeBaseStructure.TIM_Period=1999;
TIM_TimeBaseStructure.TIM_Prescaler=35999;
//定时时间为1s
voidTIM2_IRQHandler(void)
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
GPIO_WriteBit(GPIOF,GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOF,GPIO_Pin_6)));
LED1灯按照1S的定时时间不断闪烁
通过本次实验,可以实现对LED灯进行定时控制其闪烁,而不需要延时函数控制了,定时时间较为精准。
实验六:
TIM2,TIM3,TIM4多定时器的应用
利用TIM2,TIM3,TIM4定时器使LED灯以不同的频率闪烁
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQChannel;
此处比上一个实验增加了2个定时器,同时又增加了一个优先级
TIM2,TIM3,TIM4
首先LED1以1S的定时时间闪烁5次,之后LED2以2S的定时时间闪烁5次,
最后LED3以3S的定时时间闪烁5次
利用定时器可以同时使LED灯按照不同的频率闪烁,但是为了现象明显,可以加一个优先级,分别观察现象。
实验七:
串口USART1读取CPU的ID号
通过USART1读取CPU的96bitID
图开发板USART原理图
voidGet_ChipID(void)/*获取芯片ID*/
ChipUniqueID[0]=*(u32*)(0X1FFFF7F0);
/*高字节*/
ChipUniqueID[1]=*(u32*)(0X1FFFF7EC);
ChipUniqueID[2]=*(u32*)(0X1FFFF7E8);
/*低字节*/
voidUSART_Configuration(void)
USART_InitTypeDefUSART_InitStructure;
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_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;
USART_Init(USART1,&
USART_InitStructure);
USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_Cmd(USART1,ENABLE);
/*EnableUSART1*/
PA9连接的是USART1Tx,PA10连接的是USART1Rx,再通过串口调试助手就可以在电脑上面显示出CPU的ID以及flash容量大小。
本次实验实现了串口和PC机的传输,可以通过USART1将CPU的ID在电脑上显示出来。
实验八:
异步通信USART2的重映射
实现异步通信USART2的重映射,将数据传送到PC机上
voidGPIO_Configuration()/*IO口初始化*/
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
/*USART2Tx-->
PD05*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
/*PD05-->
JP7WR*/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&
GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
/*USART2Rx-->
PD06*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
该程序将USART2重映射到PD05,PD06引脚
PD05连接的是USART2Tx,PD06连接的是USART2Rx,通过串口调试助手就可以在电脑上面显示ProgramRunning!
通过本次实验,可以实现对异步通信USART2的重映射,再通过串口调试助手在电脑上显示出来。