完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、实验说明
本次实验建立在第三个实验基础上,稍加修改,通过串口调试助手发送数据到Proteus来实现对流水灯的启动和停止,所以实验采用2个通信串口,实验原理非常简单,只要熟悉第三次实验的过程,就非常容易,只是在上节的基础上建立通信串口和通信串口中断,在通信中断中加入按键的软件中断,从而控制流水灯的启动和停止。(启动还是实验一的流水灯工作方式,停止则为保持现有状态)过程非常简单,只需几分钟搞懂。 二、在实验之前我们需要下载两个软件工具 1.虚拟串口 a.网上下载串口调试助手,按照步骤安装,链接:虚拟串口下载链接 b.添加2对端口COM4、COM8和COM2、COM7。如下图所示: 2.串口调试助手 a.网上下载串口调试助手,按照步骤安装 b.配置串口里面参数并打开。如下图所示: 这里需要打开两次因为我们需要两个窗口,一个发送启动,一个发送停止。 并且一个配置串口COM7、一个配置串口COM8。参数什么的按以下步骤。 c.这时串口调试助手的串口就已经连接好了,我们可以点击开始,然后再虚拟串口查看连接的情况。 三、在Proteus中配置实验所需器件 1.Proteus配置中我们就不细讲,只讲添加配置原件,具体过程自己实现,因为前三次课程大家已经非常熟悉的会用proteus了,还不熟悉的可以回看前面的实验。 2.在第三次实验基础上增加以下原件COMPIM和VIRTUAL TERMINAL,注意:wo这里用的通信串口USART2所以占用了PA2口,所以在第三次的实验基础上,我还改变了两个按键的端口,原来是PA1和PA2,现在改为PA0和PA1,总体图如下,具体的请继续往下看,一步步讲解。 a.点击P,然后输入COMPIM,添加。 b.添加两个COMPIM(也就是RS232),,看准连接的端口,TXD和RXD的连接情况,如下图所示。 b.点击INSTRUMENTS选择VIRTUAL TERMINAL c.配置端口COMPIM,双击COMPIM,输入以下参数,如下图所示。 四、keil中配置代码 1.在第三次试验流水灯的基础上不需要添加任何东西,只是修改某部分,打开第三次实验的main.c文件,并删除main.c中的内容,将以下代码拷贝进去。(手机端可能看到的代码不全,但都在代码框里) #include "stm32f10x.h" GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; USART_InitTypeDef USART_InitStructure; void TIM2_Config(void); void EXTI0_EXTI1_Config(void); void USART_Config(void); uint32_t recieve_ch; int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); TIM2_Config(); EXTI0_EXTI1_Config(); USART_Config(); GPIOC->ODR=0x00ff; while (1) { } } void TIM2_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 10000; TIM_TimeBaseStructure.TIM_Prescaler = 799; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // TIM_Cmd(TIM2, ENABLE); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI0_EXTI1_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void USART_Config(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //GPIO_cnf.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; 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_Cmd(USART1, ENABLE); USART_Init(USART2, &USART_InitStructure); USART_Cmd(USART2, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); } 2.选中stm32f10x_it.c文件并打开,删除stm32f10x_it.c文件所有内容,将以下代码复制进去即可。 #include "stm32f10x_it.h" uint32_t i=0,j=0; void TIM2_IRQHandler(void) { if(i<8) { if((TIM2->SR&0x0001)==0x0001) { TIM2->SR&=0x0000; GPIOC->ODR=~(1< i++; } } else { if(j==0) GPIOC->ODR=0x0000; if(j<16) { if((TIM2->SR&0x0001)==0x0001) { TIM2->SR&=0x0000; GPIOC->ODR^=0x00ff; j++; } } else { i=0; j=0; } } } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); TIM_Cmd(TIM2, ENABLE); } } void EXTI1_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line1) != RESET) { EXTI_ClearITPendingBit(EXTI_Line1); TIM_Cmd(TIM2, DISABLE); } } void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { EXTI_GenerateSWInterrupt(EXTI_Line0); } } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { EXTI_GenerateSWInterrupt(EXTI_Line1); } } 五、实验操作 1.将keil生成的hex文件加载到proteus中,点击运行。刚才以上步骤中已经配置好了虚拟串口和串口调试助手,如果有关闭的,请重新打开和配置虚拟串口和串口调试助手。 2.因为有两个串口调试助手的页面,我们提前选的是COM8串口调试助手的发送数据使流水灯启动,COM7的串口调试助手发送数据停止。 a.选择COM8串口调试助手发送任意数据,启动流水灯,如下图所示。 b.点击发送之后,如下图,流水灯开始工作。 c.选择COM7串口调试助手发送任意数据,停止流水灯,则流水灯一直保持现在状态。如果想继续开启,则在COM8串口调试助手继续发送数据,就可开启串口调试助手。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 06:42 , Processed in 0.816156 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号