用STM32F0和CCD能力风暴如何实现巡线线功能是否可行

1751人阅读
STM32(5)
1、通过STM32F0的数据手册,我们可以知道,系统最高频率为 48M。时钟树如图,由图可知系统时钟可以由HSE/HSI/PLL其中之一提供。时钟作为MCU的心跳,提供者其运行的能量,因此时钟的配置很重要,但对于一些刚接触ST的人来说,详细深入的理解其时钟,是需要时间的。
2、如何快速准确的配置时钟,ST给出了很好的工具,你不必去看着参考手册,搞了半天还可能是错的,但是若有时间还是应该深入的理解是时钟的配置。
&&& 工具下载链接
&&&&&& http://www.stmcu.org/download/index.php?act=ziliao&id=131#134
&&&& 在应用笔记中找到STM32F0xx系列微控制器的时钟配置工具,下载下来得到一个EXCEL表文件。
3.打开这个EXCEL文件 ,这个文件需要启动 宏才能在点击其中的按钮来配置自己所需的时钟。
&&& 对于 微软EXCEL ,只需要按照文件中的提示,启用宏,并且配置合理后,就可以配置自己所需的时钟
&&& 对于 WPS EXCEL ,需要安装 宏插件,因为其本身可能没有这个功能,配置成功,也可以正常使用工具。
&&& 根据自己的硬件配置来配置自己的时钟,然后,点击 START,然后,点击 中间的按钮就可以生成相应的C文件,可以看到其名字就是 system_stm32f0xx.c 把这个文件直接替换工程中的同名文件,这样时钟就配置完成了。
&& 打开该文件,可以发现,该文件中包含 三个函数 SystemInit、SystemCoreClockUpdate、SetSysClock,其关键作用就是 SystemInit 和SetSysClock。细心的人会发现,SystemInit函数会在系统启动文件会先被调用,这有就是说,在MAIN函数中没必要重新再调用该 函数。
4、时钟的配置在参考手册Reset and clock control 章节有详细介绍。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:24367次
排名:千里之外
原创:17篇
(6)(1)(3)(2)(1)(1)(3)(1)STM32F0的BOOT配置及相关话题-ST技术方案-意法半导体STM32/STM8技术社区
STM32F0的BOOT配置及相关话题
发布时间:
来源:微信号:ST MCU 信息交流
关于STM32F0系列的启动配置,有人说有点看不太懂,貌似有两套启动方式,又是脚又是选项位的。其实,它跟其它STM32 系列一样也是有三种启动模式,只是配置方式上有其特色。
它有两种配置方式,第一种是利用BOOT0物理脚和Nboot1、Boot_Sel选项位来确定启动模式;第二种只使用Boot_Sel、Nboot1 、Nboot0 三个选项位来确定启动模式,完全省却了物理脚,多出一根脚给用户应用。
对于第一种配置方式,所有STM32F0系列的芯片都适用。第二种配置方式仅适用于STM32F04X和STM32F09X系列的器件。
下图是STM32F0系列启动模式配置表。
红色方框内就是上面所指的第一种配置方式,对所有STM32F0芯片适用。图表中的灰色区域就是前面所说的仅适用于STM32F04X和STM32F09X的配置方式,
可以看出,对于STM32F04X和STM32F09X到底使用哪种配置方式取决于Boot_Sel选项位。对于非STM32F04X和STM32F09X的32F0系列芯片,配置方式只能使用第一种配置方式,此时Boot_Sel固定为1。
这里不妨说说第一种配置方式,该方式对所有STM32F0芯片都适用。BOOT0脚置高、置低简单,Nboot1、Boot_Sel选项位怎么定的呢?
Nboot0 、Nboot1、Boot_Sel选项位在用户选项字节里,一起来看看。
显然,从其出厂的默认初始值可以看出,Nboot0、Nboot1、Boot_Sel选项位的默认值均为1,即默认为第一种配置方式。
如果此时BOOT0脚为1则从system memory启动,即从芯片内嵌的BOOTLOADER启动。
如果此时BOOT0脚为0,则从main flash memory启动,进入用户程序。
针对STM32F04X/STM32F09X的第二种配置方式 ,这里就不多说了。个人觉得如果不是特别需要那个BOOT0脚、或者对这个做法特别感兴趣的话,大可不必花太多心思和精力在第二种配置方式上 。毕竟你得自行编写用户代码修改Nboot0、Nboot1、Boot_Sel相关选项位,而且这个过程还是有些折腾。折腾了半天可能就为多用一根IO脚,此时BOOT模式完全由选项位来确定,个人觉得也不是那么直观和方便 。
ST官方有一篇应用笔记就是针对STM32F04X/STM32F09X的第二种配置方式的应用介绍的,该笔记名为《STM32F09X不使用BOOT脚实现SYSTEMBOOTLOADER升级代码》,有兴趣的可以去下载看看。
倒是有关STM32F04X/STM32F09X两个子系列的空检操作值得了解下。
所谓空片一般是指从芯片出厂起就没用过或用过但经过CHIP erase操作后的芯片。
STM32F04X/STM32F09X芯片复位后通过检测地址0x的内容是否为0xFFFFFFFF且上面提到的Boot_Sel选项位是否为1来判断该芯片是否为空片。若是,则设置相关空检标志Empty Check。
在芯片被判定为空的条件下,即使当前BOOT配置为从main flash memory启动,芯片硬件也会跳到System Memory 去执行内嵌启动程序。用过其它STM32芯片的人就会明显感觉到这里有个好处,这样通过ISP模式进行烧录后不必将BOOT配置脚拨来拨去的。如果量产的话,还是省了不少事。
STM32F0参考手册里在针对空检标志的描述时,应该说上面那段英文讲得很清楚了,后面做了一句补充式的描述&检查地址0x的内容是否为 0xFFFF FFFF作为判断为空的条件&。这一说可能反而增加了理解上的困扰,本来说空片就完了,让芯片回归到出厂初始状态就好。至于对某地址内容或选项位的检测只是对空片的一个简单确认。
围绕TM32F04X/STM32F09X芯片的空检话题及下载烧录,ST官方也有份应用笔记,名为《STM32F091空片使用system bootloader下载代码》,推荐下载阅读,可以加深理解,从中或许还能顺便了解些别的东西。
上面提到的两篇应用笔记,都可以去ST MCU中文网 .cn搜索相关关键字即可找到。
长按上方精灵鸟识别图中二维码可关注公众号
针对全球越来越多的电子产品公司计划在新产品中采用USB Type-C(TM)和电力传输(PD,Power Delivery)技术,意法半导体(ST)发布一款经过行业认证的基于其领先市场的STM32微控制器的软件解决方案,让USB Type-C(TM)和电力传输(PD)集成工作变得更容易。
针对全球越来越多的电子产品公司计划在新产品中采用USB Type-C和电力传输技术,意法半导体(ST)发布一款经过行业认证的基于其领先市场的STM32微控制器的软件解决方案,让USB Type-C(TM)和电力传输(PD)集成工作变得更容易。
STM32F0系列是基于Cortex(TM)-M0内核的32位入门级产品系列,沿用现有STM32(R)优异基因,针对8位MCU市场,为成本敏感型应用而设计的。
意法半导体 (STMicroelectronics,简称ST) 全面升级STM32F0超值系列 ARM(R) Cortex(R)-M0微控制器的功能。为了加大对成本敏感的消费电子、智能电表、通信网关和物联网等应用的支持,新产品增加了USB接口,并加大了闪存容量。
横跨多重电子应用领域、全球领先的半导体供应商意法半导体(STMicroelectronics,简称ST)与致力于开发全新商用设备以解决全球一些最紧迫难题的Eltopia Communications 携手宣布,Eltopia的Intelligent Foundation项目(代号为MiteNot)采用意法半导体的STM32F0微控制器,以及多个传感器和电源管理芯片,用于监测、采集环境数据,消灭可能导致蜂群衰竭失调综合症(CCD, Colony Collapse Disorder)的寄生物。
Tel: 3-8064
备案号: 苏ICP备号-2STM32F0 无法使NRF2401工作,求达人指点迷津! (amoBBS 阿莫电子论坛)
我的图书馆
STM32F0 无法使NRF2401工作,求达人指点迷津! (amoBBS 阿莫电子论坛)
STM32F0 无法使NRF2401工作,求达人指点迷津!
首先,说一下情况:
参考STM32F0开发板的例程中的推挽输出(参照GPIO),上拉输入(参照EXTI),复用输出(参照UART),然后照着正点原子的ALIENTEK MINISTM32 实验 无线通信实验完成了连线以及配置,但是,无法使这两个板子通讯,经过检测,发现F0的板子的NRF24L01_Check()一直无法过去,while在那里,现在传上代码,请达人们给予指点,谢谢了
程序很简单,就是初始化24L01及检测它的存在
主函数部分
int main(void)
& & NRF24L01_Init();& & //初始化NRF24L01
& & while(NRF24L01_Check());//检测24L01,一直死在这里,很不解
&&while (1)
24L01函数部分
const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //发送地址
& && && && && && && && && && && &
//初始化24L01的IO口
void NRF24L01_Init(void)
& & GPIO_InitTypeDef GPIO_InitS
& & RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOC, ENABLE);& &
& & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
& & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;& &//推挽输出
&&GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
& & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
& & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
& & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;& &//推挽输出
&&GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
& & GPIO_Init(GPIOC, &GPIO_InitStructure);
& & GPIO_SetBits(GPIOC,GPIO_Pin_4);
& & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
& & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN&&;& &//上拉输入
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
& & GPIO_Init(GPIOC, &GPIO_InitStructure);
& & SPIx_Init();& & //初始化SPI
& & Clr_NRF24L01_CE;& &&&//使能24L01&&NRF24L01_CE
& & Set_NRF24L01_CSN;& & //SPI片选取消 NRF24L01_CSN& && && && && &
void SPIx_Init(void)
& && &&&GPIO_InitTypeDef GPIO_InitS
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
& && &&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE );& && &
& && &&&GPIO_DeInit(GPIOA);
&&/* Connect pin to Periph */
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);& &
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
&&GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
&&/* Configure pins as AF pushpull */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);
& && &&&SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD&&//设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
& && &&&SPI_InitStructure.SPI_Mode = SPI_Mode_M& && && && && & //设置SPI工作模式:设置为主SPI
& && &&&SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;& && && && && & //设置SPI的数据大小:SPI发送接收8位帧结构
& && &&&SPI_InitStructure.SPI_CPOL = SPI_CPOL_L& && && && && & //选择了串行时钟的稳态:时钟悬空低电平
& && &&&SPI_InitStructure.SPI_CPHA = SPI_CPHA_1E& && &&&//数据捕获于第一个时钟沿
& && &&&SPI_InitStructure.SPI_NSS = SPI_NSS_S& && && && && & //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
& && &&&SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;& && && && && & //定义波特率预分频的值:波特率预分频值为256
& && &&&SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;& && &&&//指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
& && &&&SPI_InitStructure.SPI_CRCPolynomial = 7;& && &&&//CRC值计算的多项式
& && &&&SPI_Init(SPI1, &SPI_InitStructure);&&//根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
& && &&&SPI_Cmd(SPI1, ENABLE); //使能SPI外设
& && &&&SPIx_ReadWriteByte(0xff);//启动传输& && &
//检测24L01是否存在
//返回值:0,成功;1,失败& && &
u8 NRF24L01_Check(void)
& && &&&u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
& && &&&u8
& && &&&SPIx_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度为9Mhz(24L01的最大SPI时钟为10Mhz)& && && && &
& && &&&NRF24L01_Write_Buf(NRF24L01_WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.& && &
& && &&&NRF24L01_Read_Buf(TX_ADDR,buf,5); //读出写入的地址&&
& && &&&for(i=0;i&5;i++)if(buf[i]!=0XA5)& && && && && && && && && && && && && && && && && && && && && && &
& && &&&if(i!=5)return 1;//检测24L01错误& && &
& && &&&return 0;& && && && && &&&//检测到24L01
本帖最后由 jiespring 于
19:28 编辑
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPIx_ReadWriteByte(u8 TxData)
& & u8 retry=0;& && && && && &&&
& & while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
& && &&&retry++;
& && &&&if(retry&200)return 0;
& && &&&}& && && && &&&
& & SPI_I2S_SendData16(SPI1, TxData); //通过外设SPIx发送一个数据
& & retry=0;
& & while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
& && &&&retry++;
& && &&&if(retry&200)return 0;
& && &&&}& && && && && && && && && && && &
& & return SPI_I2S_ReceiveData16(SPI1); //返回通过SPIx最近接收的数据& && && && && && && && &
红色部分和原子的不一样,因为F0的SPI部分有
void SPI_SendData8(SPI_TypeDef* SPIx, uint8_t Data)
uint8_t SPI_ReceiveData8(SPI_TypeDef* SPIx)
我还是怀疑是初始化部分的配置(IO及SPI)不对,请有使用过F0和SPI的达达给予指点
公益广告:本论坛不得使用、宣传Q群。 有讨论请在论坛里进行。 违者将封锁ID.
jiespring 发表于
我还是怀疑是初始化部分的配置(IO及SPI)不对,请有使用过F0和SPI的达达给予指点 ...
在调试中,到时一起交流下
公益广告:发表招聘帖子需要缴费,有需要可以联系网站工作人员王小姐:.
fengchi 发表于
在调试中,到时一起交流下
终于有人关注了、
十分感激啊
公益广告:广告只能发在本论坛的广告区,否则将封锁ID。
有人试过没?
奇怪的接收和发送不一致
本帖子中包含更多资源
才可以下载或查看,没有帐号?
头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽
搞定,哈哈
原来是SPI初始化少加了一句M3里没有的语句
jiespring 发表于
搞定,哈哈
原来是SPI初始化少加了一句M3里没有的语句
fengchi 发表于
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
MARK,正要学这个呢
标记一下,现正在用STM32F030呢
hqf_mcu 发表于
标记一下,现正在用STM32F030呢
这个代码我的板子早就做好了程序
wanqin_008 发表于
这个代码我的板子早就做好了程序
求贴个最简单的工程!
wanqin_008 发表于
这个代码我的板子早就做好了程序
啊哈,我也刚好
TA的最新馆藏[转]&
喜欢该文的人也喜欢基于华清远见STM32f051的 IIC从模式实现方法 --嵌入式学院(华清远见旗下品牌)
基于华清远见STM32f051的 IIC从模式实现方法
作者:卢老师,讲师。
在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备。
下面是关于stm32f051的从模式实现方法,主要思路为从设备从中断里面接受 IIC主设备发送的数据,并加以处理。
下图为STM32F051的最小系统:
IIC从模式 GPIO的配置
根据原理图查ST32F051的datasheet
配置引脚:
void I2C_GPIO_Configuration(void)
&&&&&&&&&&&&&&&&GPIO_InitTypeDefGPIO_InitS
&&&&&&&&&&&&&&&&/* Enable
GPIOA clock */
&&&&&&&&&&&&&&&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
&&&&&&&&&&&&&&&&/*!< sEE_I2C Periph clock enable */
&&&&&&&&&&&&&&&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 , ENABLE);
&&&&&&&&&&&&&&&&/*!< GPIO configuration */
&&&&&&&&&&&&&&&&/*!< Configure sEE_I2C pins: SCL */
&&&&&&&&&&&&&&&&GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
&&&&&&&&&&&&&&&&GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//GPIO_Mode_IN
&&&&&&&&&&&&&&&&GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
&&&&&&&&&&&&&&&&GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;//open-drain
&&&&&&&&&&&&&&&&GPIO_Init(GPIOB , &GPIO_InitStruct);
&&&&&&&&&&&&&&&&/*!< Configure sEE_I2C pins: SDA */
&&&&&&&&&&&&&&&&GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
&&&&&&&&&&&&&&&&GPIO_Init(GPIOB , &GPIO_InitStruct);
&&&&&&&&&&&&&&&&/* Connect PXx to I2C_SCL*/
&&&&&&&&&&&&&&&&GPIO_PinAFConfig( GPIOB , GPIO_PinSource8, GPIO_AF_1);
&&&&&&&&&&&&&&&&/* Connect PXx to I2C_SDA*/
&&&&&&&&&&&&&&&&GPIO_PinAFConfig( GPIOB ,GPIO_PinSource9, GPIO_AF_1);
IIC从模式配置,在配置时,需要设置地址,在这里设置为0XA0,而从设备的时钟属于被动模式,有IIC的主端确定。
void I2C_Configuration(void)
&&&&&&&&&&&&&&&&I2C_InitTypeDef
&&&&&&&&&&&&&&&&/* I2C configuration */
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_E
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_DigitalFilter = 0x00;
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_OwnAddress1 =0xA0;
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_Ack = I2C_Ack_E
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7
&&&&&&&&&&&&&&&&I2C_InitStruct.I2C_Timing = 0xb0420f13;//100Kbits
&&&&&&&&&&&&&&&&/* I2C Peripheral Enable */
&&&&&&&&&&&&&&&&I2C_Cmd(I2C1, ENABLE);
&&&&&&&&&&&&&&&&/* Apply I2C configuration after enabling it */
&&&&&&&&&&&&&&&&I2C_Init(I2C1, &I2C_InitStruct);
下面是IIC中断函数的实现
void I2C1_IRQHandler(void)
&&&&&&&&&&&&&&&&I2C_ClearITPendingBit(I2C1, I2C_ISR_ADDR|I2C_ISR_STOPF );
&&&&&&&&&&&&&&&&if(I2C_GetITStatus( I2C1, I2C_IT_RXNE));
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&I2Cbuf[I2C_IT_FLAG++]=I2C_ReceiveData(I2C1);
&&&&&&&&&&&&&&&&}
中断函数里面,清中断为2种,一种为IIC从地址校验成功,一种是数据传输过程中停止。对于从设备,接受数据中断才是我们最需要的,这里我们将IIC接受的数据存入定义好的数组中,这样以备后用,同是,在读取接受数据时,硬件已经将接受数据的中断清楚掉。

我要回帖

更多关于 无人机电力巡线 的文章

 

随机推荐