你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F407 SPI 如何设置不同的波特率?

[复制链接]
zhengfucool 提问时间:2023-9-7 21:15 / 未解决

请教下大家F407 SPI1(Master)的波特率,因为读取TI ADS1274,需要将SPI波特率设置成某些特殊值,比如 51200 * 256 = 13107200,请问是否能做到?

目前我自己在努力的方向:

一是设置不同的fPCLK(也就是想办法修改时钟树的各个分频系数),然后再用BR[2:0]来进一步分频(但尝试了很久,貌似找不到合适的系数,能得到上述“奇怪”的外设时钟频率);

SPIBaudRate.png时钟树png.png

二是,从网上搜索学习到SPI的时钟源,可以是内部时钟,也可以是外部时钟(如何改变spi的时钟频率?-电子发烧友网 (elecfans.com))。请问外部时钟如何设置?如果可以外部时钟的话,那就灵活了。我这边F407的SPI1是工作在Master模式下。

多谢了,

image.png
image.png
收藏 评论2 发布时间:2023-9-7 21:15

举报

2个回答
dhvf1 回答时间:2023-9-8 13:59:43
STM32F407的SPI可以通过设置分频系数来实现不同的波特率。具体而言,SPI的时钟由主设备控制,其时钟源可以是APB2时钟(最大频率为84MHz),也可以是PLLCLK(最大频率为168MHz)。

通过设置SPI的分频系数,可以将SPI时钟分频为不同的频率,从而实现不同的波特率。SPI的分频系数由两个参数决定:分频器和时钟极性。

分频器参数由SPIx_CR1寄存器中的BR[2:0]位控制,可以设置分频系数2、4、8、16、32、64、128和256。时钟极性参数由SPIx_CR1寄存器中的CPOL和CPHA位控制,可以选择时钟极性为高电平或低电平,并且可以选择时钟相位为第一边沿或第二边沿。

以下是一个示例代码片段,演示如何设置SPI1的波特率为10 MHz:

  1. ```c

  2. // 设置SPI1分频系数为8

  3. SPI1->CR1 &= ~(SPI_CR1_BR_Msk);

  4. SPI1->CR1 |= SPI_CR1_BR_1;



  5. // 设置SPI1时钟极性为高电平,时钟相位为第二边沿

  6. SPI1->CR1 &= ~(SPI_CR1_CPOL_Msk | SPI_CR1_CPHA_Msk);

  7. SPI1->CR1 |= SPI_CR1_CPOL;



  8. // 设置SPI1的时钟频率为10 MHz

  9. const uint32_t spi_clk = SystemCoreClock / 8;

  10. const uint32_t desired_clk = 10000000;

  11. uint32_t spi_div = (spi_clk / desired_clk) - 1;

  12. SPI1->CR1 &= ~(SPI_CR1_BR_Msk);

  13. SPI1->CR1 |= (spi_div << SPI_CR1_BR_Pos);

  14. ```
复制代码
在上面的代码中,我们首先将SPI1的分频系数设置为8,然后将时钟极性设置为高电平,时钟相位设置为第二边沿。最后,我们通过计算出SPI1的实际时钟频率和所需的时钟频率之间的分频系数,将SPI1的分频系数设置为所需的值(在本例中为10 MHz)。

butterflyspring 回答时间:2023-9-8 17:37:32
楼主已经注意到了,SPI的时钟只能来源于Fplck 的分频,而且分频系数是2的指数次方,所以只能主时钟HCLK是特殊值才有可能,这是由芯片物理结构决定的。
另外SPI是同步通讯,又是做主,想不明白为什么要配合从的时钟频率。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版