ST-LINK有时不能下载:no target connected
网上方法:最近在使用stm32f4-discovery 板子时,偶然间遇到st-link no target connected的问题,本来一直都很正常,突然就冒出这个问题,我一开始以为是板子出毛病了。后来上网查阅了资料后才发现不是板子的问题。解决办法如下:(开发环境是 MDK 4.6)
显示“NO target connected“ 但是驱动没有问题 在设备管理器中海显示出有stlink
原因是配置了GPIOA的 14 13这两个口了
”
GPIOA_MODER复位后的值为:0x2800 0000,即将GPIO13\14配置为复用模式,但为什么在程序配置了GPIO13\14为输出,并且在目标芯片有复位的情况下也会引起SWD无法仿真、下载的问题。
”
解决办法:
1、先确认目标板上电。
2、先长按住目标板上的复位键,再点击 Settings,再松开目标板上的复位键。
3、此时KEIL打开Settings的设置对话框,请确认有SWD的内容后,再进行下一步。
4、将STM32F41Discovery板断电,重新上电。
5、先长按STM32F4Discovery的复位键,再点击仿真或者下载按钮,再松开复位键。
注:这里点仿真到松开复位键不是每一次都能成功,每次点了仿真键到松开复位键的时间每次都不同,在某一个点时,就可以进入仿真或者下载程序了。板子就恢复正常了。但需要注意的是,在程序里一定要避开对GPIO13\GPIO14的配置。
注意:松开复位键 需要感觉的 太短或者太长都不可以的 。需要多次试验才能够成功。
EXTI中断
EXTI->PR = 1 << 4; //清除中断标志,写1清除
当在外部中断线上发生了选择的边沿事件,该位被置’1’。在该位中写入’1’可以清除它,也可以通过改变边沿检测的极性清除。
TIM通用定时器
8M通过倍频器到72M。
不直接用72M晶振:防止干扰。
//定时器3初始化
void TIM3_Init(char clock,int Preiod)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //打开时钟
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period = Preiod;
//预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz
TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}
USART
应用场合:
1、芯片之间的近距离通信
2、与PC机之间的通信
3、模块之间的远距离通信
异步串行通信协议:
1、起始位
2、数据位(8、9) 9奇偶校验位
3、奇偶校验位(9位)
4、停止位(1、1.5、2 )
5、波特率设置(速度)
USART1模块的设置:UE位使能、M位来定义字长、STOP停止位的位数、TE位使能、BBR寄存器选择要求的波特率。
void UART1_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
UART1NVIC_Configuration();//中断配置
}
void UART1NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}