{
GPIO_Write(GPIOF,0xffff);
GPIO_SetBits(GPIOF, GPIO_Pin_7); /* LED2 点亮 */
Delay(0x5fFFFF);
GPIO_ResetBits(GPIOF, GPIO_Pin_7);/* LED2 熄灭 */
Delay(0x5fFFFF);
EXTI_ClearITPendingBit(EXTI_Line3); } } }
void EXTI9_5_IRQHandler(void) {
int i=0;
if(EXTI_GetITStatus(EXTI_Line8) != RESET) {
for(i=0;i<10;i++) {
GPIO_Write(GPIOF,0xffff);
GPIO_SetBits(GPIOF, GPIO_Pin_8); /* LED3 点亮 */
Delay(0x5fFFFF);
GPIO_ResetBits(GPIOF, GPIO_Pin_8);/* LED3 熄灭 */ Delay(0x5fFFFF);
EXTI_ClearITPendingBit(EXTI_Line8); } } }
4、实验现象
中断优先级从高到低依次为:SW3,SW2,SW1
原来5个LED灯都处于熄灭状态,按下SW1,LED3应该闪烁10次,当其闪烁5次后按下SW2,LED2也应该闪烁10次,当其闪烁4次后按下SW3,LED1也应该闪烁10次,则当LED1闪烁完10次后,LED2继续闪烁6次,之后LED1继续闪烁5次。
5、实验总结
通过本次实验,可以对LED状态实行中断嵌套,由以上实验现象,得出以下结论:高中断优先级可以打断低优先级,中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,反之,低中断优先级不可以打断高优先级。
实验五:TIM2的基本应用
1、实验要求
TIM2定时器将LED灯定时点亮和熄灭一定的时间
2、电路原理图
6
3、软件分析
TIM_Cmd(TIM2, ENABLE); /* TIM2 enable counter */ TIM_TimeBaseStructure.TIM_Period = 1999;
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //定时时间为1s void TIM2_IRQHandler(void) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_WriteBit(GPIOF, GPIO_Pin_6,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_6))); }
4、实验现象
LED1灯按照1S的定时时间不断闪烁
5、实验总结
通过本次实验,可以实现对LED灯进行定时控制其闪烁,而不需要延时函数控制了,定时时间较为精准。
7
实验六:TIM2,TIM3,TIM4多定时器的应用
1、实验要求
利用TIM2,TIM3,TIM4定时器使LED灯以不同的频率闪烁
2、电路原理图
3、软件分析
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 此处比上一个实验增加了2个定时器,同时又增加了一个优先级
4、实验现象
中断优先级从高到低依次为:TIM2,TIM3,TIM4
首先LED1以1S的定时时间闪烁5次,之后LED2以2S的定时时间闪烁5次, 最后LED3以3S的定时时间闪烁5次
5、实验总结
利用定时器可以同时使LED灯按照不同的频率闪烁,但是为了现象明显,可以加一个优
8
先级,分别观察现象。
实验七:串口USART1读取CPU的ID号
1、实验要求
通过USART1读取 CPU 的 96 bit ID
2、电路原理图
图 开发板USART原理图
3、软件分析
void Get_ChipID(void) /* 获取芯片ID */ {
ChipUniqueID[0] = *( u32 *)(0X1FFFF7F0); /* 高字节 */ ChipUniqueID[1] = *( u32 *)(0X1FFFF7EC);
ChipUniqueID[2] = *( u32 *)(0X1FFFF7E8); /* 低字节 */ }
void USART_Configuration(void) {
USART_InitTypeDef USART_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); /* Enable USART1 */ }
4、实验现象
PA9连接的是USART1 Tx,PA10连接的是USART1 Rx,再通过串口调试助手就可
9
以在电脑上面显示出CPU的ID以及flash容量大小。
5、实验总结
本次实验实现了串口和PC机的传输,可以通过USART1将CPU的ID在电脑上显示出来。
实验八:异步通信USART2的重映射
1、实验要求
实现异步通信USART2的重映射,将数据传送到PC机上
2、电路原理图
图 开发板USART原理图
3、软件分析
void GPIO_Configuration()
10
/* IO口初始化 */
{
GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; /* USART2 Tx --> PD05 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /* PD05 --> JP7 WR */ 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; /* USART2 Rx --> PD06 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE); }
该程序将USART2重映射到PD05,PD06引脚
4、实验现象
PD05连接的是USART2 Tx,PD06连接的是USART2 Rx,通过串口调试助手就可以在电脑上面显示Program Running!
5、实验总结
通过本次实验,可以实现对异步通信USART2的重映射,再通过串口调试助手在电脑上显示出来。
11