STM32CubeMX----杂记

发布者:HeavenlySunset最新更新时间:2018-07-01 来源: eefocus关键字:STM32  CubeMX 手机看文章 扫描二维码
随时随地手机看文章

(1)在使用FSMC作为LCD接口时,同时ENABLE了FreeRTOS,发现生成的工程文件,编译之后会出问题。


        


         研究后发现问题出在“FreeRTOSConfig.h”这段代码:


/* Cortex-M specific definitions. */

#ifdef __NVIC_PRIO_BITS

 /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */

 #define configPRIO_BITS         __NVIC_PRIO_BITS

#else

 #define configPRIO_BITS         4

#endif

   当我使用了FSMC并且ENABLE 了FreeRTOS,“__NVIC_PRIO_BITS”这个宏就会被定义,此时RTOS的宏


“configPRIO_BITS”会被定义为“__NVIC_PRIO_BITS”,这个宏在“stm32f205xx.h”里面:


#define __NVIC_PRIO_BITS          4U       /*!< STM32F2XX uses 4 Bits for the Priority Levels */

也就是说“configPRIO_BITS”这个宏被定义为“4U”也就是类型为“unsigned int”的4。


我尝试在汇编函数里,直接将:


mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

改为:


mov r0, #4U

编译出错,但如果将“4U”改为“4”是没问题的。


后记:在韦东山第一期加强版视频编写LED程序的视频有讲到,在汇编里面指令需要占据一定的位数,例如:



mov r0, #0x12345678

是不行的,因为“MOV”这个指令本身占据了一定的位数。而“4U“本身为32位,stm32为32位系统,所以”MOV“这个指令码被清零了。具体可以了解下机器码跟汇编。


(2)ADC采集一次信号后不再采集


        问题可以参考这个链接:http://www.ing10bbs.com/forum.php?mod=viewthread&tid=194&extra=


        除了RCC、SYS,只配置了ADC2的IN8,NVIC Settings打开ADC全局中断:


  生成工程的改动很小,增加了一个ADC值获取的回调函数以及一个ADC启动的函数:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

{

   ADC_VAL = ADC2->DR;

}

ADC初始化里面添加了IT启动:


HAL_ADC_Start_IT(&hadc2);

然后进入仿真发现,ADC采样一次信号后,ADC2->DR寄存器里面的值不变了。研究了老半天,看了几遍参考手册中ADC寄存器的描述,怀疑是EOCS寄存器的问题。所以将:


hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

改为:


hadc2.Init.EOCSelection = ADC_EOC_SEQ_CONV;

很好,ADC连续采样了。但又产生一个新的问题,程序一直重复进入ADC中断,不进入while(1);大循环了。


由此猜测,是不是因为ADC采样转化太快了,导致未处理完一次中断又产生新的中断?


又进行修改:


sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

改为:


sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;

这次可以正常运行了。其实,最好在启动ADC之后,关闭不必要的中断源,例如只需要看门狗中断:


__HAL_ADC_DISABLE_IT(&hadc2, ADC_IT_EOC|ADC_IT_JEOC|ADC_IT_OVR);

后记:在MDK仿真下观察寄存器,发现关闭中断的指令,关闭的是”ADC_IT_OVR“这个中断源。


这个是”溢出中断“的中断源。当ADC以”ADC_SAMPLETIME_3CYCLES“进行转换时,当前中断尚未处理完便再次触发中断


就会造成中断溢出。所以将ADC转换速率降低,或者关闭”ADC_IT_OVR“程序可以正常运行。


(3)内部FLASH的操作


MCU是F205VCT6


1、写


//STM FLASH写函数

void STMFLASH_Write_NoCheck ( uint32_t WriteAddr, uint16_t * pBuffer, uint16_t NumToWrite )   

{

        uint16_t i;        

 

     HAL_FLASH_Unlock();

     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR|FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

        for(i=0;i

        {

          HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,WriteAddr,pBuffer[i]);

          WriteAddr+=2;                                    //地址增加2.

        }  

HAL_FLASH_Lock();

}


写之前要去除FLASH的写保护,然后就是写函数中的清楚标志位问题。如执行了


HAL_FLASH_Unlock();

然后立即执行写函数,会发现第一个数据写不进FLASH,但是后续的数据是正常的。试过增加几十毫秒的延时,但是结果依旧错误。如果在写之前先清除错误标志位,则可以正常写入。


2、擦除


//STM FLASH擦除函数

void SectorErase(u32 SectorNum )  

{  

    FLASH_EraseInitTypeDef  eraseInit;  

    u32         error;  

 

 HAL_FLASH_Unlock();

 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR|FLASH_FLAG_PGPERR|FLASH_FLAG_PGSERR);

 eraseInit.Sector = SectorNum;

    eraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;   

    eraseInit.NbSectors   = 1;  

    eraseInit.VoltageRange   = FLASH_VOLTAGE_RANGE_3;

  

    if ( HAL_FLASHEx_Erase( &eraseInit, &error ) == HAL_OK )  

    {  

    }  

HAL_FLASH_Lock();

}  


跟写函数一样,解锁FLASH后立即擦除,需要先清除错误标志位。


另外,执行擦除函数,如果是擦除0~3扇区,则可以正常进入仿真(代码在扇区0,擦除扇区0会出现异常,但确实能进入仿真的)界面。


如果擦除4~5扇区,则出现以下问题


不能进入仿真,但是扇区擦除却是成功的。解决办法,暂时未找到


关键字:STM32  CubeMX 引用地址:STM32CubeMX----杂记

上一篇:STM32定时器----多通道PWM捕获
下一篇:STM32HAL----USB串行FLASH模拟U盘

推荐阅读最新更新时间:2024-03-16 16:07

单片机的四种烧写方式
单片机的四种烧写方式简介 单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计、方便了逻辑的设计、丰富了逻辑的输出。不同厂家的单片机需要不同编程IDE来实现编程。在学习单片机之前,要先清楚单片机程序是如何烧写到单片机内部的,在烧写的过程中需要用到什么工具?因为不通用的烧写工具可能价格较贵,比如说Micorchip单片机使用的ICD系列编程器,单台价格在600-1000元人民币之间。今天和大学来认识一下单片机最常用的四种烧写方式和所使用到的工具。 1.使用JTAG接口实现 JTAG接口是一种标准的测试协议,可以实现编程时在线调试,利用单步追踪可以很方便的查找代码
[单片机]
单片机的四种烧写方式
stm32学习笔记(七)定时器中断
#include timer.h #include led.h ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //Mini STM32开发板 //通用定时器 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/12/03 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 正点原子 2009-2019 //All rights reserved ////
[单片机]
<font color='red'>stm32</font>学习笔记(七)定时器中断
嵌入式STM32建立工程的详细步骤
创建工程步骤: 1、 在硬盘上创建工程目录Project,(cm3、Startup、STM32F10x_StdPeriph_Driv er、Users)添加到Project文件夹下,再创建一个Mdk文件,在Mdk下再创建一个Output和Listing文件夹。 目录结构如上图左栏。 2、创建工程。 点击保存后。即可 因为我们自己已经把启动代码复制到工程目录下了,所以不需要添加软件自带的。点击否。 3、建立工程管理目录树。 然后将其它的组也创建后,并且加入对应的源代码文件。结果如图。 点击OK后,进入到KEIL软件中。结果如图。 接下来。点击Target Options按钮 选中
[单片机]
嵌入式<font color='red'>STM32</font>建立工程的详细步骤
STM32的5个时钟源知识
  众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。   其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。   内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号.   高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16
[单片机]
基于STM32的12864串行时序的实现
12864液晶并口驱动程序用的比较多,但是考虑到有的时候单片机或者MCU的IO口有限时就可以使用串行驱动方法。以下是12864液晶串行时序图,下面就根据这个图来分析一下12864串行时序的实现,只有真正弄清楚了时序图才能真正了解串行传输的原理。 从图上可以看出串行传输时需要用到CS,SCLK,SID三根信号线,但是由于CS是高电平有效,所以也可以把CS长接高电平,那样就只需要两根线就OK了,当然当使用12864串行模式时,PSB引脚必须接低电平,复位RST引脚可以悬空不接,因为12864内部有上电复位电路。 由于数据是传输是以一个字节8bits为单位,所以下面贴出传输一个字节的函数实现 void Writ
[单片机]
STM32库函数和寄存器操作的思考
从开始接触51单片机,到现在开始转型学习功能更加强大的STM32f407系列, 学习过程中引入了库函数及相应操作,当时赶着进度做点东西出来,有点不求甚解。现在返回来求索:相比于原来51单片机的寄存器,32系列的寄存器无论是个数还是实现功能时多个寄存器之间的调用配合,使用难度都高了不少,所以有了库函数和相应的固件库来减少难度。 先说一下固件库(这个我们最开始安装完MDK缺了它总是各种报错的东西)和相应库函数: 固件库这边时首先将各个设备所有寄存器的配置字进行预定义,然后封装在结构体或者枚举变量中,等到用户调用相关库函数时,会根据用户传入的参数从这些已经封装好的结构体或者枚举变量中取出与之对应的配置字,最后写入相应寄存器中完成对底层寄
[单片机]
意法半导体(ST)推出新款STM32 Nucleo开发板
2016年2月22日,意法半导体(STMicroelectronics,简称ST)推出价格实惠且尺寸紧凑的STM32 Nucleo-144系列开发板,加强其对市场领先的STM32系列32位闪存微控制器的支持。新款的144引脚开发板进一步扩大现有STM32开发生态系统的范围,通过提升板上连接通信功能,让客户能够使用从能效最高的到性能最高的任何一款STM32微控制器快速开发应用。 新款开发板完全兼容现有STM32开发生态系统,包括专用的应用扩展插接板,让开发人员能够在最终应用中轻松集成从电机驱动器到环境传感器的专用功能。此外,新开发板还通过三种连接端口提供无限的应用扩展功能,除现有的Nucleo-64板上的Arduino Uno和
[嵌入式]
意法半导体(ST)推出新款<font color='red'>STM32</font> Nucleo开发板
STM32的串口通信原理介绍
介绍串口通信 按照数据传送方向分类 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端 按照通信方式分类 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线 在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved