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

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

[复制链接]
abner88 发布时间:2014-3-11 22:34
    之前买的STM32F0Discovery开发板一直没用,前几天才开始折腾,记录下第一个工程吧。
3 X3 d* `& u1 I: t$ |, |4 k    玩过STM32F10xx,发现F0开发方式和F1很接近,F1很多代码稍作修改便可移植到F0上。6 n- y; C9 {. O. z( Y0 H; d
    基于IAR7.1建立工程。
; A$ j- O5 c, ]) M( u3 E. X 
7 D4 |7 D) s( |" Q
- T" ]9 N. }0 N7 v$ n   E  R7 c! z9 M& _. `$ X  S! f
 ) M0 s% |- H) j, B7 m- J
 ' L; m+ V# i* i6 h: @( s

" V9 h% o0 M$ P、、串口初始化
2 G$ w6 `" W, Z/ G" Y; V 
3 n$ d6 x: a6 _' |: @( wvoid Usart_Config(uint16_t Usart_BaudRate)4 {  R" A* ?" P: Z: G0 ~) ~
{8 ^: {7 G2 |& G1 f* B& J0 D
  NVIC_InitTypeDef  NVIC_InitStructure;
9 ~6 e$ I9 a3 Y8 y) Q0 V  GPIO_InitTypeDef  GPIO_InitStructure;
8 Y5 _0 \7 a: g- e5 F, Y. c9 T3 Y  USART_InitTypeDef USART_InitStructure; 9 m2 }7 a0 x1 h
 
9 c4 j/ ^% C! j6 |  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);   //enable clock of GPIOA* l& L+ W' \+ @. H7 K, u
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //enable clock of USART1
. i  F( w  E- i/ C7 k  ! H4 q' l& u4 k9 l
  /* Configure USART Tx as alternate function push-pull */
( M% q0 C1 P& G7 m& `  GPIO_InitStructure.GPIO_Pin       =   GPIO_Pin_9 | GPIO_Pin_10;: Z$ G: q" I5 y& n0 E
  GPIO_InitStructure.GPIO_Mode      =   GPIO_Mode_AF;. z; S, S4 Z: m! O
  GPIO_InitStructure.GPIO_Speed     =   GPIO_Speed_50MHz;
2 ]  _+ D  b3 D% |! w  GPIO_InitStructure.GPIO_OType     =   GPIO_OType_PP;
* j2 V& C: @/ F  GPIO_InitStructure.GPIO_PuPd      =   GPIO_PuPd_UP;
2 m2 z* K: r8 R) G  GPIO_Init(GPIOA, &GPIO_InitStructure);% D& m' o* Q' Y# X% ?, G5 Y, i. E7 Z
  : _, K) L. G7 X) `
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);//PA9 as Usart1_TX
2 T; N. i$ q" R# e  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);//PA10 as Usart1_RX
' f8 `! D8 @  l0 @# _
  ' {6 P% L# \' a$ ~9 ^
  USART_InitStructure.USART_BaudRate          =   Usart_BaudRate;2 o  N1 `7 f% {. K
  USART_InitStructure.USART_WordLength        =   USART_WordLength_8b;
/ A$ ~5 q; |/ J5 ~/ P  USART_InitStructure.USART_StopBits          =   USART_StopBits_1;
4 k( ?" K8 k* [5 e: B6 b% K  USART_InitStructure.USART_Parity            =   USART_Parity_No;' I! t- K+ G/ d/ U
  USART_InitStructure.USART_Mode              =   USART_Mode_Rx | USART_Mode_Tx;) N( Y$ F; s8 ~- x; V' O/ F
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
# D3 [, S6 x7 U1 m  USART_Init(USART1,&USART_InitStructure);5 ^$ z8 V! ?# h( k9 |( N3 V  x
  , d; O  B+ `5 `  |; p+ r
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;' o  a9 L/ V: Q9 F
  NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
# l+ B1 X4 T, E/ o" k  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
7 s1 p0 ^/ ~5 U$ _, L  NVIC_Init(&NVIC_InitStructure);5 v* z: y) j' C% n3 ]9 L! r$ p
0 C6 [$ a! g) e$ X: O
#if USART_RXNE_INTERRUPT      , Z! L/ i$ v4 W# {9 C
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
9 h1 A; |; E0 A5 d8 e  ?" y7 z* b#endif$ h4 z/ D) F# y  J! Z) F1 E
- W8 v; d2 m( n
  USART_Cmd(USART1, ENABLE);//enable USART13 n* q  w0 t4 {; v, {( W9 _, y; B
 
# T% j. z7 s* R* [7 l/ x" B#if USART_TC_INTERRUPT        0 q6 n( r7 g' |) F" s2 J- `
  USART_ClearFlag(USART1,USART_FLAG_TC);   6 X: a8 J2 {- A7 d  k3 m
  USART_ITConfig(USART1,USART_IT_TC,ENABLE);# |& ^  a, \2 T6 o
#endif

8 E& H4 n, S& I3 v1 Q0 N. X}; \. Q, A# d. t/ J1 z4 |' L" o
    在做GPIO复用功能映射的时候,第二个参数不要习惯性的写成GPIO_Pin_9,红色部分代码$ _! ^" M, Y) P% {
    为方便代码裁剪,使用宏定义来控制。因为使能中断的时候会自动发送一个空闲帧,TC中断标志位会置位,所以TC中断开启的操作应当放在串口使能操作之后,并且开启TC中断之前应当清除一次TC中断标志位,否则一旦串口初始化完毕,就会进入TC中断。如上蓝色部分代码。
/ W1 f& j+ i5 Z) H3 j7 E6 u: M# f2 r 
4 Y8 G- b! _# @5 p! C9 K+ @- @1 L 
/ b9 G' R! ]1 O/ t5 w# V& ? & j/ S; K! c: g! k5 v& }
、、发送字节8 n8 o9 n% M+ ]/ n; C' ^
 
, w% I6 p) z0 d/ Vvoid Usart_TxByte(uint8_t dat)
, M8 p3 b% L+ n7 x{
2 O) d7 m# [0 }8 ?: _9 \  USART_SendData(USART1,dat);/ O7 t4 f0 w) S$ M8 q8 M$ O0 p
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);//wait untill transmitt complete
2 E+ R* C1 P1 H}
" F( ]2 y/ K- q& v ( L; J+ C( ^0 u4 A1 `
 ) c3 r, E: s& N! Y. \- G' _" h$ a

+ M! v5 B: r4 T* F2 [4 \、、发送字符串9 F" @7 \. w% W
 - n  D- ?7 y' s9 z5 j
void Usart_TxString(uint8_t *string)
. y/ \4 A7 P( T" N- i, ?{# _3 s3 n2 v- r8 H6 ~1 C- E  U
  while(*string != '\0')
* e/ a: L$ w$ N7 e7 u    Usart_TxByte(*string++);9 n" G- n$ _: G2 p/ t
}
9 c' Q6 d7 r& E3 w1 W* }# Z5 \) k 
7 ]9 T7 u" K& x) [ ! f! ?% E, q* j* G) f
2 O7 ~; z0 {8 P0 r8 ~
、、中断服务函数+ w2 V& A3 N3 L+ T8 ~7 C2 o2 Y+ t- o
 . A" y: ~5 R$ d, c8 Z2 a  r

6 ]& C! o7 ^+ t<span style="font-size: small;">void USART1_IRQHandler(void)! q/ J! f, j5 S4 k+ m
{' f% R3 }  i& }0 B1 m/ }
  static uint8_t n = 0;+ e% e# g" d+ ~& C6 T
  4 e, o* I  \1 ]
  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE))    //ORE interrupt- T2 a) o0 g9 r6 ^+ h0 B
    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))        //溢出中断5 N1 e" b9 D2 C5 O' z  b
    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发表:2 i  f# ?  u- h1 R/ i" I. j
支持!
  `5 f* z) R; D! T2 W* S* N 第一次在论坛发帖,感谢管理员支持
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 手机版