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

cube MX创建I2C和SPI的应用(连续测试4天,未出BUG)  

[复制链接]
kevin0129 发布时间:2015-1-11 11:10
本帖最后由 kevin0129 于 2015-1-11 14:14 编辑
- ^% t- w/ ^2 A9 S: T! Y
  f" M  O! M* [+ U+ o" M: p      最近看到沐紫老师手上有多余的nucleo stm32f072的板,果断以之前的活动价购买了一块,之前研究过stm32f103,当使用072的时候发现它的这个HAL库和标准库差别十分大,于是便研究了一下这个HAL库,之前使用了一点这个cube MX,发现这个配置软件非常好用,相对于103来说,我们不用再来自己动手配置外设了,直接设置几个参数就够了,今天来介绍下cube mx生成一个带I2C和SPI的工程的步骤(之前用103没怎么调通过I2C,一直软件模拟,这次尝试下,发现没有出现I2C bug,应该不是侥幸,毕竟测试了四天四夜.......)
) x$ H) c* ?" G# A1.打开cubemx后选择nucleo f072的板子,这个很好找
2 C+ z& D  J- Z' b$ g2.配置外设的引脚7 e# A, P9 \+ s& ~2 r
1.jpg
: ?9 r+ r4 v" a, G# P7 Z) p) PI2C就直接选择I2C模式( |5 R! c, P% q# M1 n
2.jpg . q( Z/ n* y& E6 S, @% \
SPI设备我用的一块显示屏,没必要去读它,我就直接选择了主机只发送的模式,如果要读写的话就不要选择这个了' [3 q; J/ Y/ u2 X
3.jpg * Y; I3 h& ]6 x. c
I2C的引脚更改,我看到板子上的SCL和SDA在PB8和PB9上果断把默认的引脚改成PB8和PB9(这个其实可以不用改的,我只是为了接线方便)
7 [9 g! V3 g' [6 z: S6 e 4.jpg ; S6 u7 X! U8 [& p
接下来配置几个I/O做显示屏的控制I/O,直接都设置为输出就够了!
* T# S" l6 o% V" y5 p3 j8 p; |% M 5.jpg
& e/ F7 V: r, O9 b. k; D0 }接下来配置时钟,我自己焊了一个HSE晶振,所以选择了外部晶振,配置系统时钟为48M,还有设置I2C的时钟为系统时钟, ?( b' n: N) s
6.jpg 8 t# E4 ^6 N' w% U7 F4 E
接下来是I2C的配置,设置为标准模式100k速度, 上升沿400ns下降沿100ns,这个地方的设置和f103的I2C配置有点不一样,我没有选择中断和DMA最后修改下I2C的GPIO配置就够了(和配置其他gpio一样)
& a+ t. V  B. F 7.jpg # S: ]+ l! g- Q8 W/ m% `/ M. D
SPI的设置更简单只需设置数据长度和速度就够了,同样没有用DMA和中断,只需配置I/O就够了  S6 W: H8 o6 s
最后去配置一下那几个控制I/O就够了,这样就可以生成工程了( l) D% v- r& p
8.jpg
, r) s( R% F4 v生成工程的时候我选择了这个,我不喜欢把所有的代码都放到main.c文件里面,看起来很麻烦,这一项是单独生成对应的外设.c和.h文件,看起来比较舒服8 g/ D6 i8 M0 K! E! g3 Y& E6 n
生成工程完毕后,外设都基本设置好了,主要配置下I2C的读写程序和SPI的写程序就够了
9 ?1 Z0 e; d+ [1 Z3 r
  1. void Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
    / s; X1 @0 O4 d' ~3 C
  2. {0 A, G! W& \. k
  3.     uint8_t TxData[2] = {REG_Address,REG_data};2 M! o& M, E+ i0 g% d. `, g' B; z: W
  4.     while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,(uint8_t*)TxData,2,1000) != HAL_OK)' @! v; _0 K+ Z
  5.     {
    ; a4 d3 T0 m  g7 p3 c
  6.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)$ R7 }- ]: W8 i
  7.                 {
    7 o0 }% P5 m$ }3 B: Z( G$ ?+ ?, Y; L
  8.                   Error_Handler();8 M) G" }/ y: d2 K' f+ w: J1 o
  9.                 }
    ! j& V/ }# \% d  c4 K
  10.     }+ c; y7 E% {- ]
  11. }
复制代码
3 W8 J. f9 m$ X( O3 G

2 i0 R1 c+ T& Z: [& K* O这是I2C的写单个字节的程序
7 m% E  X# h1 B  |
  1. uint8_t* Double_ReadI2C(uint8_t REG_Address). b/ b) f" ~$ U& |7 u. ~
  2. {
    + P% \8 Q; N0 W' M
  3.    
    5 v) X5 m% W1 n5 f2 R  V! j1 ~2 T
  4.     while(HAL_I2C_Master_Transmit(&hi2c1,I2C1_WRITE_ADDRESS,&REG_Address,1,500) != HAL_OK)
    ( g" I0 Y) C& ?; ?" A3 i
  5.     {
    5 W6 {8 ~2 x4 W
  6.          if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF), d! e% S1 B4 k* }4 G
  7.                 {4 m' U) n. L( Q( R7 {$ b
  8.                   Error_Handler();
    $ j+ n6 O2 U+ i$ |
  9.                 }* D+ J( d# Z* j  g: w
  10.     }
    " Z4 }. f' G) N: A( {
  11.    / X+ o" P9 q9 j/ F5 e
  12.     if(HAL_I2C_Master_Receive(&hi2c1,I2C1_READ_ADDRESS,(uint8_t*)RxBuffer,2,1000) != HAL_OK)3 c- s) A, |7 @9 l6 A7 e5 k% s
  13.     {6 e  M* a6 R" y
  14.         if (HAL_I2C_GetError(&hi2c1) != HAL_I2C_ERROR_AF)( q, ]6 f, p6 ]; p
  15.                 {$ u2 \! `7 F5 `1 h3 o- T
  16.                   Error_Handler();
    . c' e1 i8 f+ W) R% [
  17.                 }  X  }' }8 ^6 U( J% r
  18.     }$ U9 H5 g3 C; k1 h8 \& F3 _
  19.     return RxBuffer;
    / T1 V) z* @) L' _9 J
  20. }
复制代码

1 h( D$ p8 ~; b: I, p1 Z这是I2C读两个字节的 程序,主要写单个字节的时候需要取地址(®_Address),由于这个HAL_I2C_Master_Transmit()这个函数的输入参数,数据那一项是一个指针,所以如果传单个字节必须取地址,有一个PDF文件介绍了HAL库函数的使用,但是全英文的,可以看看提高自己的英文水平,主要的两个I2C函数都在这里,可以直接调用HAL 的API,用起来非常方便!4 I% Q0 T2 d: n; I5 t& o- N, r' M
  1. void LCD_Send_Data(unsigned char Data)2 f/ J) t! o" c
  2. {8 ~" N3 u; U# r& {4 ^# P; @$ O
  3.         LCD_CS_L();6 v! S9 w" }: Y* O. ]
  4.         LCD_DC_H();  1 _) D& z" y5 d( P1 J# z* L5 Z( o
  5.         HAL_SPI_Transmit(&hspi1,&Data,1,100);
    ' J" Y- G; F; z
  6.    
    6 j9 c; [4 A. Q
  7.    LCD_CS_H();5 P/ x0 u/ x  m9 G' P  D
  8.         LCD_DC_H();  1 G2 B' u0 W) B
  9. }/ e4 U* d, R8 f. w" S9 y
  10. void LCD_Send_CMD(unsigned char CommandByte)" A0 O* H3 B2 P( T. {
  11. {4 k6 b  x2 p  n% s% ]9 g
  12.         LCD_CS_L();) @7 x) M3 D$ Q# S) Z3 w
  13.         LCD_DC_L();  , J( l! x% @* o3 r2 R
  14.     HAL_SPI_Transmit(&hspi1,&CommandByte,1,100);$ X: z/ ^6 w# q# E
  15.    LCD_CS_H();* O' c( f* ]# m9 C) N
  16.         LCD_DC_H();  
    % J& d! ?+ Z* d0 V
  17. }
复制代码
( D( C( s" Y6 I+ I0 d- {
这是SPI的写函数,一个发命令,一个发数据,也是调用了HAL的API  HAL_SPI_Transmit()这个函数,同样注意发一个字节的时候也要去地址
2 z8 G* ?8 h9 b# f4 ?2 p8 j! |主要的东西都完成了,只要把对应的LCD驱动和I2C设备的驱动复制过来,然后把读写接口对上,工程就完成了。
" O& E9 l' P+ l0 d+ J5 b本来自己的程序没有问题,但是调试的时候发现I2C一直卡死,还以为时出现了I2C,郁闷了一段时间,其实是自己没看电路图,造成视觉上的蒙蔽
$ z# |2 G  o, O  q/ o6 c. Z% t* U 9.jpg
5 ^/ O# Y0 o: s# B有没有人以为这里就是对应的SCL和SDA,我之前一直把SCL和SDA插在这里,结果I2C就一直卡死,表示自己给自己眼睛坑了,结果去查电路图才发现
4 V) o* F2 D0 q0 @2 A 10.jpg
+ x4 r* a/ q6 Q4 n# N' CSCL和SDA分别是第二排和第三排靠内的那两个,换下接口后I2C就立马工作了,表示自己在这个上面把自己坑了半天........% r* R! z" _; _& _5 Q
STM32F0的HAL库用户手册_部分1.pdf (6.34 MB, 下载次数: 1865)
赞 收藏 14 评论58 发布时间:2015-1-11 11:10

举报

58个回答
R2D1 回答时间:2015-3-3 18:24:56
feiante 发表于 2015-1-13 10:386 ~" Q8 f" `. p( F9 ~1 j+ Y
我在做SPI时,也是用HAL_SPI_Transmit(),发送的数据是一个数组,为什么我连接上逻辑分析仪看,都是FF呢 ...
+ g3 G" J# u( s/ z5 A2 H9 T0 n; R% ?8 ^8 |
我的IIC也显示为“FF”,原因是每次断电或复位产生的信号干扰被误读。
iwos2610 回答时间:2015-7-9 19:42:00
kevin0129 发表于 2015-1-12 11:062 D, K* b' R' a: E6 R" }" L
F1的HAL库谁知道什么时候会出,感觉ST有点放弃了F1一样!

3 g! B& Q4 B2 Y- X: N( t木有放弃啊,已经出来了,F7现在都支持了
6 \' ~: \" I% y! G% Phttp://www.st.com/web/en/catalog ... _searchtype=keyword
snjeym 回答时间:2016-10-25 22:25:04
snjeym 发表于 2016-10-23 23:31& f- m& X0 p  x
你好,同样是这块板,他的SPI基于HAL库的接受功能你试了没有?就是HAL_SPI_Receive或者HAL_SPI_TransmitRec ...

) G; q( x/ [0 U* _) ]5 r) p/ L已解决,cube设置错误,把SPI定义成了单发。
麟狮蕟 回答时间:2015-1-11 12:31:58
我的是F334的还没开工!!
wamcncn 回答时间:2015-1-11 13:14:49
恭喜你,不出毛病,继续找毛病,找到BUG你就彻底懂了
kevin0129 回答时间:2015-1-11 13:31:15
我现在板子还没断电,不知道什么时候会死机,感觉有点浪费电.......
aderson 回答时间:2015-1-11 14:02:43
BUG问题楼主有遇到过吗?
kevin0129 回答时间:2015-1-11 14:08:03
目前还没有.......
晓枫VS枯叶 回答时间:2015-1-11 14:19:37
看来一下,感觉HAL比标准库简单,但是相对于MBED的来说还是复杂了一下,如果mbed能把cubemx的图形界面引脚配置吸收进去的话感觉就完美了!
smcdh 回答时间:2015-1-11 15:30:24
我还在用MDK,看来要学一下cube MX
kevin0129 回答时间:2015-1-11 15:50:07
mbed还没看过,不过看到这块板子好像支持mbed,先学下这个HAL库再去看mbed吧!
琴箫雨霁 回答时间:2015-1-11 15:58:08
I2C我也经常用到,不过在使用f103时还是更倾向于使用模拟的,不知道f1系列的HAL库什么时候才有!
kevin0129 回答时间:2015-1-12 11:06:13
F1的HAL库谁知道什么时候会出,感觉ST有点放弃了F1一样!
琴箫雨霁 回答时间:2015-1-12 12:47:30
应该不会放弃吧,F1的出货量现在这么高,ST怎么会有钱不赚呢。
电子松鼠 回答时间:2015-1-12 14:56:38
楼主写的很详细,受教啦。,不过我之前用cubemx经常自动闪退,大家有遇到类似情况吗?
zhous 回答时间:2015-1-12 15:07:22
点赞!!!!
fjjjnk1234 回答时间:2015-1-12 15:24:45
这工具确实挺方便的
1234下一页

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版