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

采用STM32cubeMX来配置串口接收中断

[复制链接]
feiante 发布时间:2015-1-7 09:43
STM32cubeMX推出一久了,而且现在除了F1以外基本上都有了。这段时间乘有点时间,来试试这个工具。
8 m4 K2 Z: |5 L! a硬件资源:采用STM32F0的探索套件
2 B0 T7 S# C6 N: N, K实验目的:
6 S: e$ ]$ d+ E% {1、完成串口发送8个数据功能,配置串口为接收中断,当串口接收到指定数目的数据时,产生中断,中断函数将接收的数据发送出来
9 F1 k/ S1 t) Z5 t: k* ~2、本实验具有按键(PA0)中断功能,当按下按键,串口发送数据。
! V& b" R, f: X( L& }具体配置:% U7 P( X4 O* `0 K# j
1、选择管脚,PA0用于按键,点击该引脚选择输入。6 O0 R8 G& r0 U( ^: o
             PC8,PC9用于LED灯。点击该引脚选择输出。
  F* H; S) |0 V0 q, n2 A# [             PA9,PA10用于串口1,串口模式选择Asynchronous。(但选择并配置了串口,这两个引脚自动就变绿了)2 ?' j3 |" G" _* s# {
捕获.JPG ! G" |5 U; i( ~( v
2、串口配置:(这个类似于我们以前编程时的串口初始化部分,包括波特率、数据位、停止位等)
( \* L7 ]/ Y; k- E  g 捕获.JPG 0 r% V) C5 h/ ~4 [; ~) U- r
这里需要注意的是:波特率最小都是115200,想设置9600,那只能最后在程序中改了。
: r5 w+ \0 K9 G, h! a) |3、串口中断配置:$ x0 z+ s7 ]( ^5 `7 q
捕获.JPG 6 M. z2 M9 ^0 L1 o3 U; x
4、完了以后就可以生成IAR或KEIL程序了,这一步大家都知道了,就不截图说明了。
2 J% e' |- Z& X7 o/ R1 F( t以下是我的测试程序。2 g7 l: j  g! t0 T6 |
程序说明:
6 v) w( ]: h3 e  N( f) Y* d, O1 y1、首先定义发送接收数组
+ l2 l0 H3 n; K( n% w" z" t  z1 ?
uint8_t TxData[8]= {0x55,0x65,0x01,0x02,0x03,0x04,0x05,0x06};
uint8_t RxData[8];
2、如果是轮询方式发送数据,采用HAL_UART_Transmit(&huart1, TxData,8,10);  
如果是中断方式接收数据,采用HAL_UART_Receive_IT(&huart1, RxData,8);  
while (1)
  {
           HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9);
           HAL_Delay(1000);
           //HAL_UART_Transmit(&huart1,TxData,8,10);  /* 通过串口1发送数组TxData的8个数据 */
           HAL_UART_Receive_IT(&huart1, RxData,8);     /* 采用中断方式接收8个数据 */
  }
3、串口接收中断服务程序:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
         HAL_UART_Transmit(&huart1,RxData,8,10);
}
4、按键中断服务程序:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == GPIO_PIN_0)
  {
      HAL_UART_Transmit(&huart1,RxData,8,10);
  }
}
使用总结、疑问及需要注意的地方:
1、串口中断配置只是具有串口全局中断,如何配置接收中断或发送中断,或空闲中断?(这点等待高手帮忙)
2、HAL_UART_Receive_IT(&huart1, RxData,8);   如果放置在while循环中,那么就可以连续进行接收中断,RxData的值就会根据接收的数据发生变化,如果放在while外面,那么只进行一次接收中断。
3、针对第2点,那么如果要一直进行中断配置,就要在主程序的while中调用,如果只是进行一次,那么就在需要的时候调用。
4、由于不能配置中断类型,所以如果把中断服务函数HAL_UART_Transmit(&huart1, RxData,8,10);放在voidUSART1_IRQHandler(void)里面就只能收到第一个数据,其他是0。比如串口调试助手发送0x55,0x65,0x01,0x02,0x03,0x04,0x05,0x06,那么中断中发送出来的数据就是0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+ [$ Q1 l, ~  j# Q0 g# G) u

新建文件夹.rar

下载

1.88 KB, 下载次数: 252

赞 收藏 3 评论19 发布时间:2015-1-7 09:43

举报

19个回答
星辰一方 回答时间:2015-2-16 19:35:35
楼主,把HAL_UART_Receive_IT(&huart1, RxData,8);放在接收完成回调函数里就可以了,不用放在while里循环……/ T3 V9 j/ `. X( V9 d0 u
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
9 Q) b# ?% r) {0 X{2 ]( }9 D* [" f- y8 K$ `0 d
HAL_UART_Receive_IT(&huart1, RxData,8);
5 i) l4 f+ _7 K2 p( x7 L6 }/ m0 g}
feiante 回答时间:2015-1-7 09:59:06
大秦正声 发表于 2015-1-7 09:48, \+ C$ F# E3 ^& v: F9 \
中断服务程序关键9 b& {/ _* R- i% j  s) x9 G" x7 d: R! k
字和以前不一样?

* X, p5 d' H5 }! O  C  V% j它也有USART1_IRQHandler,但是中断处理函数是HAL_XXX_Callback,这个要单独写,它有这样一句话:xxxx不能修改。
feiante 回答时间:2015-1-7 15:21:55
强仔00001 发表于 2015-1-7 15:19
  r/ w: m4 ]: y9 v7 {. ^这工具好用么,我还是喜欢自己敲代码
+ O1 K9 R  t1 M5 w) E
感觉还可以吧,正在测试中
大秦正声 回答时间:2015-1-7 09:48:16
中断服务程序关键1 S7 `( R, R! F3 t5 K8 B9 h% t
字和以前不一样?
大秦正声 回答时间:2015-1-7 10:01:40
谢谢回复
aaa999kk 回答时间:2015-1-7 10:06:42
测试的时候总需要经常中断的?
feiante 回答时间:2015-1-7 15:15:40
aaa999kk 发表于 2015-1-7 10:06. L: d; y: \1 X$ u3 ?
测试的时候总需要经常中断的?

: E# g8 V' Y! C3 M什么意思?没有看懂
强仔00001 回答时间:2015-1-7 15:19:09
这工具好用么,我还是喜欢自己敲代码
强仔00001 回答时间:2015-1-7 15:30:17
feiante 发表于 2015-1-7 15:218 Q( t+ u9 Q4 l8 W/ s
感觉还可以吧,正在测试中
0 G' b( i# t. }
有空我也去试试
我是酱油哥 回答时间:2015-1-7 16:10:24
cube 真心不错 啊
foxglove 回答时间:2015-2-15 14:03:39
正在测试中
星辰一方 回答时间:2015-2-16 19:37:00
不过这个接收数据长度必须完全匹配怎么破?要是放在实际应用中,我怎么知道接收数据多长呢?
wyxy163@126.com 回答时间:2015-2-17 18:15:41
提示: 作者被禁止或删除 内容自动屏蔽
yujianghao 回答时间:2015-12-22 13:52:57
非常好
12下一页

所属标签

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