PA0 PB0 --PG0对应同一个中断线号,设计外部中断硬件电路时不要重复,如PA0和PB0不能同时设计为外部中断
在stm32的头文件和启动文件设计中,中断线号10~15共用相同的入口函数,因此需要在中断中进行判断,来确定是那个信号触发了中断,如下代码判断
/****************************************************************
* function : EXTI15_10_IRQHandler
* Description : 外部中断10和13共用中断入口,通过触发后状态检查确定
触发中断的管脚并执行相应代码。
* input : 无
* output : 无
*****************************************************************/
void EXTI15_10_IRQHandler(void)
{
ITStatus EXTI10_Status;
ITStatus EXTI13_Status;
EXTI10_Status = EXTI_GetITStatus(EXTI_Line10); //获得外部中断10的状态
EXTI13_Status = EXTI_GetITStatus(EXTI_Line13); //获得外部中断13的状态
if(EXTI10_Status == SET)
{
led_light_up(1);
}
if(EXTI13_Status == SET)
{
led_light_up(2);
}
EXTI_ClearFlag(EXTI_Line10 | EXTI_Line13); /*清除外部中断10或者13的挂起位 */
}
当CPU退出停止模式时,会强制切换到内部时钟,因此在进入停止模式后一句要加上SystemInit()重新配置系统时钟,避免时钟改变,所以注意,时钟的初始化是放在紧邻进入停止模式后,唤醒后程序马上就接着执行睡眠后面的初始化时钟语句。
STM32三种启动模式对应的存储介质均是芯片内置的,它们是:
1)用户闪存 = 芯片内置的Flash。
2)SRAM = 芯片内置的RAM区,就是内存啦。
3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。
在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:
BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序
BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。
BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。
系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:
Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动
可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验
而且一键下载之后,程序从系统存储器启动
从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚,读取复位向量等)。
电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出
STM32 的 硬件IIC 是鸡肋!请谨慎使用 开启FSMC则IIC就无法工作
在STC 单片机中内置了EEPROM(其实是采用IAP 技术读写内部FLASH 来 实现EEPROM),这样就节省了片外资源,使用起来也更加方便
串口下载又叫ISP下载,PLC通过485线控制变频器调速,电脑用USB转串口连接PLC。用CH340的话,变频器一旦启动,电脑端和PLC的通讯就很容易中断,用FT232则无此问题
STM32F107的APB1(PCLK1)操作速度限制在36MHZ,其挂载外设如DAC1\SPI2速度在36MHZ以下,APB2全速。
PCLK1对应APB1外设
定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2
重映射我们同样要使能复用功能的时候讲解的 2 个时钟外, 还要使能 AFIO 功能时钟, 然后
要调用重映射函数
抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高
因为 LOAD 仅仅是一个 24bit 的寄存器,延时的 ms 数不能太长。否则超出了 LOAD 的范围,高位会被舍去,导致
延时不准。最大延迟 ms 数可以通过公式:nms<=0xffffff*8*1000/SYSCLK 计算。SYSCLK 单
位为 Hz,nms 的单位为 ms。如果时钟为 72M,那么 nms 的最大值为 1864ms。超过这个值,建
议通过多次调用 delay_ms 实现,否则就会导致延时不准确
usart.c里面包含了2个函数一个是void USART1_IRQHandler(void);另外一个是void uart_init(u32
bound);里面还有一段对串口 printf 的支持代码,如果去掉,则会导致 printf 无法使用,虽然软
件编译不会报错,但是硬件上 STM32 是无法启动的,这段代码不要去修改
分频因子要确保 ADC1 的时钟(ADCCLK)不要超过 14Mhz。 这个我们设置分频因子位 6,时钟为 72/6=12MHz,库函数的实现方法是:RCC_ADCCLKConfig(RCC_PCLK2_Div6);