新手上路
- 积分
- 33
- 金钱
- 33
- 注册时间
- 2019-1-26
- 在线时间
- 6 小时
|
1金钱
STM32F103精英开发板目前出现了这样的情况。
一,在打开串口助手的时候,使用SWD烧录程序会死机(Keil勾选“Reset and Run”),按复位键也没用,必须关闭电源重新上电。
二,如果不打开串口助手,烧录正常运行。
三,在打开串口助手时,按复位键会死机。
四,使用原子教程里推荐的串口助手不会出现这种情况。
五,烧录原子给的例程和上述情况一样。
随便写写的程序————————————————————————————————————————————————————————————
#include "stm32f10x.h"
#include "stdio.h"
u16 TIM5_CH1_Capture_STA;
u16 TIM5_CH1_Capture_VAL;
u16 TIM_Time;
u32 Result;
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
return ch;
}
int GetKey (void) {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
void USART1_Init()
{
GPIO_InitTypeDef GPIO_InitUSART1;
USART_InitTypeDef USART1_InitUSART1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
USART_DeInit(USART1);
GPIO_InitUSART1.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitUSART1.GPIO_Pin=GPIO_Pin_9;
GPIO_InitUSART1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitUSART1);
GPIO_InitUSART1.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitUSART1.GPIO_Pin=GPIO_Pin_10;
GPIO_Init(GPIOA,&GPIO_InitUSART1);
USART1_InitUSART1.USART_BaudRate=9600;
USART1_InitUSART1.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART1_InitUSART1.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART1_InitUSART1.USART_Parity=USART_Parity_No;
USART1_InitUSART1.USART_StopBits=USART_StopBits_1;
USART1_InitUSART1.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART1_InitUSART1);
USART_Cmd(USART1,ENABLE);
USART_GetFlagStatus(USART1,USART_FLAG_TC);
USART_ClearFlag(USART1,USART_FLAG_RXNE);
}
void PWM_Captuer()
{
GPIO_InitTypeDef GPIO_InitCapture;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitCapture;
TIM_ICInitTypeDef TIM_ICInitCapture;
NVIC_InitTypeDef NVIC_InitCapture;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitCapture.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitCapture.GPIO_Pin=GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIO_InitCapture);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
TIM_TimeBaseInitCapture.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitCapture.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitCapture.TIM_Period=9;
TIM_TimeBaseInitCapture.TIM_Prescaler=7199;
TIM_TimeBaseInitCapture.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitCapture);
TIM_ICInitCapture.TIM_Channel=TIM_Channel_1;
TIM_ICInitCapture.TIM_ICFilter=0x00;
TIM_ICInitCapture.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitCapture.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitCapture.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM5,&TIM_ICInitCapture);
NVIC_InitCapture.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitCapture.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitCapture.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitCapture.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitCapture);
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
TIM_Cmd(TIM5,ENABLE);
}
void GPIO_LED()
{
GPIO_InitTypeDef GPIO_InitLED;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitLED.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitLED.GPIO_Pin=GPIO_Pin_5;
GPIO_InitLED.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitLED);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART1_Init();
PWM_Captuer();
GPIO_LED();
printf("SysInit Ok!\r\n");
while(1)
{
if(TIM5_CH1_Capture_STA&0x8000)
{
Result=(TIM5_CH1_Capture_STA&0x3fff);
Result*=100;
Result+=TIM5_CH1_Capture_VAL;
printf("Key Input :%d us\r\n",Result*10);
TIM5_CH1_Capture_STA=0;
TIM5_CH1_Capture_VAL=0;
Result=0;
}
}
}
void TIM5_IRQHandler()
{
if(TIM_GetFlagStatus(TIM5,TIM_FLAG_Update))
{
TIM_Time++;
if(TIM_Time>=1000)
{
TIM_Time=0;
if(GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_5))
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
else
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
if(TIM5_CH1_Capture_STA&0x4000) //是否已经触发高电平(按键已按下)
{
if((TIM5_CH1_Capture_STA&0x3f)==0x3fff) //查看是否溢出
{
TIM5_CH1_Capture_STA&=0x3fff;
TIM5_CH1_Capture_STA|=0x8000;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else TIM5_CH1_Capture_STA++;
}
}
if(TIM_GetFlagStatus(TIM5,TIM_FLAG_CC1))
{
if(TIM5_CH1_Capture_STA&0x4000) //0x40指已触发过高电平
{
TIM5_CH1_Capture_STA&=~0x4000;
TIM5_CH1_Capture_STA|=0x8000;
TIM5_CH1_Capture_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}
else
{
TIM5_CH1_Capture_STA|=0x4000;
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
}
TIM_ClearFlag(TIM5,TIM_FLAG_CC1|TIM_FLAG_Update);
}
|
最佳答案
查看完整内容[请看2#楼]
使用原子教程里推荐的串口助手不会出现这种情况,说明其它串口助手不适合使用在这板子上,建议用推荐的串口助手
|