新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2019-9-3
- 在线时间
- 6 小时
|
1金钱
- static void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- // /* 嵌套向量中断控制器组选择 */
- // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- /* 配置USART为中断源 */
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- /* 抢断优先级*/
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- /* 子优先级 */
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- /* 使能中断 */
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- /* 初始化配置NVIC */
- NVIC_Init(&NVIC_InitStructure);
- }
复制代码 串口中断
- void Timerx_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
- //定时器初始化 //arr,psc
- TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
- TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 分频因子
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
- TIM_ITConfig( //使能或者失能指定的TIM中断 允许更新中断
- TIM4, //TIM2
- TIM_IT_Update | //TIM 更新(溢出)中断
- TIM_IT_Trigger, //TIM 触发中断 (捕获中断等) 地址值 ((uint16_t)0x0040)
- ENABLE //使能
- );
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级1级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- TIM_Cmd(TIM4, ENABLE); //使能TIMx(定时器)外设 开启定时器
- }
复制代码 定时器中断未开启定时器中断的话,串口中断可以正常收发。
- void TIM4_IRQHandler(void)
- {
- // u8 showstr[StrMax]={0};
- if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
- {
- TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
- if(START_FLAG)
- {
- // LED1_Flash(3,100);
- count++;
- if(count>=10*SweepTime)
- {
- count=0;
- count1++;
- NowFre = SweepMinFre+SweepStepFre*count1;
- if(NowFre>SweepMaxFre) count1 = 0;
- delay_ms(5);
- ADC_Read(); //读值
- }
- }
- }
- }
复制代码 以上为定时器中断函数ADC_Read()函数里面调用了串口发送程序。
一开始通过串口发送开启定时器之后,便一直在定时器中断服务函数里,不断的执行ADC_Read函数,在ADC_Read函数里的串口发送函数不断向上位机发送数据,而无法再次接收到上位机通过串口发送给单片机的指令。
如何才能接收到上位机通过串口发送给单片机的指令?
|
|