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

【原创】STM32F0第一个工程,LED/串口收发中断

[复制链接]
abner88 发布时间:2014-3-11 22:34
    之前买的STM32F0Discovery开发板一直没用,前几天才开始折腾,记录下第一个工程吧。
. [& s% s# ]$ `" U  m    玩过STM32F10xx,发现F0开发方式和F1很接近,F1很多代码稍作修改便可移植到F0上。4 M6 e9 ~/ r% H: C5 _4 K, m
    基于IAR7.1建立工程。* X+ Q: _7 u! U5 z
 ' _: f1 c- B$ e$ d$ D. H. v' ]
  B; s' A7 u0 d* C" M( V
 ( q# Q, \8 j8 E9 i" F; E
 , P! {2 `9 o( a6 W
 
0 I3 f8 |6 A) d  ]
9 p1 i7 h' Y+ j1 L+ G* c* i4 G、、串口初始化$ i' c7 |' b% D# Y; m" O* Q+ S
 
" M7 v. H  V1 H1 C5 u$ bvoid Usart_Config(uint16_t Usart_BaudRate)
8 W/ d  ?' }1 P; r8 V% U# a{
. c: [1 ?! [5 I# i1 }1 x% v/ M- I  NVIC_InitTypeDef  NVIC_InitStructure; & E6 w. b% }1 s6 I: Y
  GPIO_InitTypeDef  GPIO_InitStructure;4 C! a1 \  `1 K& h  Q* x
  USART_InitTypeDef USART_InitStructure; 4 U9 Q. |8 O( T, Y! _- q
 
( {9 r+ [9 ], P8 p9 L  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);   //enable clock of GPIOA
/ B1 d/ t3 Z. @  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //enable clock of USART1
3 e, S0 R* X) h# ` 
% f7 d% D. x+ p7 w  /* Configure USART Tx as alternate function push-pull */" X) d. G" R& l
  GPIO_InitStructure.GPIO_Pin       =   GPIO_Pin_9 | GPIO_Pin_10;
8 I* G1 y: k  s5 i9 d  GPIO_InitStructure.GPIO_Mode      =   GPIO_Mode_AF;% B0 x/ O* e* D5 n' K  C7 {' ~
  GPIO_InitStructure.GPIO_Speed     =   GPIO_Speed_50MHz;& ~0 Y5 h6 T2 u! I. r
  GPIO_InitStructure.GPIO_OType     =   GPIO_OType_PP;5 P% T6 x/ c4 J8 }" A: D2 l$ D' H2 s
  GPIO_InitStructure.GPIO_PuPd      =   GPIO_PuPd_UP;
8 Z$ }! ^" ?2 C- _; t  GPIO_Init(GPIOA, &GPIO_InitStructure);& _3 I3 u4 B. N( {
 
  D" D* p  }0 D4 y  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);//PA9 as Usart1_TX
+ D; _2 A. u+ x8 q  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);//PA10 as Usart1_RX

9 U' a# ~6 O# p* J; [( ]$ R 
7 ~# c; o/ c+ V. H  USART_InitStructure.USART_BaudRate          =   Usart_BaudRate;/ k7 m% \  }$ N8 L2 `1 m
  USART_InitStructure.USART_WordLength        =   USART_WordLength_8b;
, {: S; O2 w1 ?5 y" e3 j1 u( G  USART_InitStructure.USART_StopBits          =   USART_StopBits_1;
7 C. q7 B0 L/ L" _) a  USART_InitStructure.USART_Parity            =   USART_Parity_No;
# K- S; ], R$ z9 R! L+ C  USART_InitStructure.USART_Mode              =   USART_Mode_Rx | USART_Mode_Tx;3 e/ x) B& m5 F! A
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
! B3 j8 h0 D4 J1 F1 |  USART_Init(USART1,&USART_InitStructure);3 k+ V$ q8 j' j& s4 ~- e
  # t  k) }# Y* p) C; Z* A
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;7 p- o1 X. {8 d6 _0 t; R
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
" C3 M' F4 M7 A, j$ G/ A  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
7 @4 ~7 N) x: ^+ j) s+ E& q  NVIC_Init(&NVIC_InitStructure);
- z3 s& a2 K. J9 \. A: Y. Q& v" X/ [- n0 W5 f: o, |0 J) d8 s" F( D
#if USART_RXNE_INTERRUPT      0 g) Y) w, R+ Q( t
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
* U1 ], d$ D. {6 k' x#endif
/ y' B9 y: M/ N7 V

* `' g4 @* P8 i) _  USART_Cmd(USART1, ENABLE);//enable USART12 B# K1 @, W9 p$ L2 a$ K5 e) h
 
! i' d. R( w8 C! [6 X" b1 b#if USART_TC_INTERRUPT        * R6 m3 U! A+ Q$ ^1 g9 b
  USART_ClearFlag(USART1,USART_FLAG_TC);  
+ m6 c  Z8 X3 d8 e  a" B  USART_ITConfig(USART1,USART_IT_TC,ENABLE);& h1 ^& R$ M* s7 i2 u! w
#endif

1 N# n2 b* V4 q' `+ A6 S- B2 A! d}
$ g+ L1 G1 U+ b; m) \  R4 Q    在做GPIO复用功能映射的时候,第二个参数不要习惯性的写成GPIO_Pin_9,红色部分代码
8 U: [, S! Z* F' h; q" i; O    为方便代码裁剪,使用宏定义来控制。因为使能中断的时候会自动发送一个空闲帧,TC中断标志位会置位,所以TC中断开启的操作应当放在串口使能操作之后,并且开启TC中断之前应当清除一次TC中断标志位,否则一旦串口初始化完毕,就会进入TC中断。如上蓝色部分代码。% E1 F" o' H: N+ C- w$ ^
 & f" p' H* m) I4 e  E. L
 
+ k# A$ {3 u4 Q- ^. F, Q; { 9 Q1 x. p6 J5 A5 P* ]# r/ X
、、发送字节
" \# @8 }$ P6 m' @  H" |* ] # J/ d" N3 \+ i6 e0 d
void Usart_TxByte(uint8_t dat)
) I& l+ k* e! H0 S) W{
4 W. `5 u) r+ ]" r: x8 v& S% @  USART_SendData(USART1,dat);
0 ~5 O& D: J) C1 T6 K. i/ N- i  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);//wait untill transmitt complete  F7 z& X8 Q# C; b  V. z
}
- k* Z! a  y+ a, q) C* } 3 V: C6 A7 S- s4 Q
 ; `" ]! g: \9 h* Z% W
  n& o0 Y. S% O
、、发送字符串# p( I7 N# c& d; W: V
 8 p6 T4 ^9 O" K$ q& b
void Usart_TxString(uint8_t *string)
4 y4 P, ?% X* @( n! @{, ^7 M: c* c) g( ^- y
  while(*string != '\0')
2 Z0 x' L; [: P6 f4 v4 Z1 l8 ^    Usart_TxByte(*string++);
# J1 P1 I6 p) A8 b}
" t7 G" v. K+ `$ l: n- F 6 l, M. Q- `% U% P$ G$ A
 : T: M" L4 {, a, c
# B0 p0 P& f4 `! Y' W% I
、、中断服务函数! \) l! E3 a+ v
 9 s' J7 G. d; S4 V3 J# T* l

" G0 k: X  R9 a& x<span style="font-size: small;">void USART1_IRQHandler(void)
( `. t- A; \' z5 y{2 ~( E" e2 }( j/ _6 c
  static uint8_t n = 0;
9 F0 F/ }4 p" h9 J4 P% t  5 H! j' x! P: L
  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE))    //ORE interrupt5 ]8 o+ a% R0 u/ N1 x- G9 x
    USART1->ICR |= 1

01--USART.rar

下载

300.04 KB, 下载次数: 528

评分

参与人数 1 ST金币 +8 收起 理由
奥丁泰尔 + 8

查看全部评分

赞 收藏 评论23 发布时间:2014-3-11 22:34

举报

23个回答
fansanderen 回答时间:2018-5-11 16:26:28
楼主你好,我用这个例程在中断一直报if(USART_GetFlagStatus(USART1,USART_FLAG_ORE))        //溢出中断
# v- D3 g' a& ~9 `    USART1->ICR |= 1 << 3;// USART_ReceiveData(USART1);这里一直执行,不知道能否解决?
dearfar 回答时间:2016-1-29 16:09:21
谢谢楼主,有用处
zui135-124601 回答时间:2015-1-7 11:08:12
有用,好东西.........................
沐紫 回答时间:2014-3-17 19:54:24

RE:【原创】STM32F0第一个工程,LED/串口收发中断

支持!
kakashi2010 回答时间:2014-3-19 00:53:42

RE:【原创】STM32F0第一个工程,LED/串口收发中断

谢谢楼主,看看吧。
bn777_mcu 回答时间:2014-3-19 08:10:51

RE:【原创】STM32F0第一个工程,LED/串口收发中断

看看
lillian-368088 回答时间:2014-3-19 08:57:32

RE:【原创】STM32F0第一个工程,LED/串口收发中断

谢谢楼主· ·· 看看
lillian-368088 回答时间:2014-3-19 08:57:47

RE:【原创】STM32F0第一个工程,LED/串口收发中断

谢谢楼主
abner88 回答时间:2014-3-20 09:48:26

回复:【原创】STM32F0第一个工程,LED/串口收发中断

回复第 2 楼 于2014-03-17 19:54:24发表:3 w" s2 H/ `& W! @$ y
支持!
- @$ K5 l; g& j* S4 M 第一次在论坛发帖,感谢管理员支持
wangjuneric 回答时间:2014-3-20 14:44:10

回复:【原创】STM32F0第一个工程,LED/串口收发中断

学习学习
q2459451851 回答时间:2014-3-25 16:15:06

回复:【原创】STM32F0第一个工程,LED/串口收发中断

恩恩,嘿嘿
w627255898 回答时间:2014-4-19 11:59:04

回复:【原创】STM32F0第一个工程,LED/串口收发中断

谢谢
jerry9203 回答时间:2014-5-2 13:52:17

回复:【原创】STM32F0第一个工程,LED/串口收发中断

赞
junliangdt 回答时间:2014-5-3 14:40:10

RE:【原创】STM32F0第一个工程,LED/串口收发中断

绝对支持,下了,学习
kenneth19800322 回答时间:2014-6-23 09:39:39

回复:【原创】STM32F0第一个工程,LED/串口收发中断

Thank you very much for your sharing.
自由人-379179 回答时间:2014-8-16 17:28:44

回复:【原创】STM32F0第一个工程,LED/串口收发中断

学习一下 好像 F0的串口中断和STM32F1的中断标志清除方式不一样
◆Flyzym◆ 回答时间:2014-8-17 11:51:03

RE:【原创】STM32F0第一个工程,LED/串口收发中断

谢谢楼主,看看吧。
12下一页

所属标签

相似技术帖

官网相关资源

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