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

Ubuntu下开发STM32---6.使用串口Part2

[复制链接]
qianfan 发布时间:2015-10-29 18:44
本帖最后由 QianFan 于 2015-10-29 18:51 编辑 ( J) Z* O; e& [# _# k8 D: R; C9 \

. t! e; q/ ?8 a2 j. ^    在上一篇Part1的时候,我们说了有个bug,也就是中断向量表的问题。其实这个问题在第4节---在SRAM中运行程序的时候就存在。只不过我们的程序中没有使用中断,也就导致这个bug没有发现。如果我们在上一节的代码中尝试将程序下载到SRAM中运行的时候,也就是make sram,sudo make burns,这样串口只能发送。不能接收。究其原因还是中断惹得祸。& T8 K0 I/ O5 h4 E4 ~  [5 U$ w
    我们使用st-flash工具直接将代码下载到SRAM中,st-flash在下载完之后,会尝试更改pc到Reset_Handler。并运行第一行代码。但是当我们的中断来了之后,该区何处寻找中断向量呢?我们仅仅改了PC的值,并没有改中断向量表的值。也就导致中断来临时,跳转到了错误的中断向量中。(应该是0x0800_0000处中断向量表中对应的位置)* {1 N" c& Z$ w% B
$ \' o# L  q, M( [9 O9 B+ a- C
如何更改中断向量表?6 f/ e9 k: j3 t, l: B7 A
更改中断向量表,需要更改SCB->VTOR。关于他的解释请参考《ARM Cortex-M3权威指南》或者网址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203hc/Cihdidh2.html 。
& T/ `' k/ V' \3 E; G3 E 2015-10-29 18:05:15屏幕截图.png 8 @, h7 b0 C( F. B
2 R2 y  T: w- v  t% _& a$ i
在system_stm32f30x.c中,有这样的代码:
6 c9 I: V4 S! G/ `. e2 O 2015-10-29 18:18:45屏幕截图.png 2015-10-29 18:19:00屏幕截图.png 7 @! u& d. Y6 {. ~# e
这个文件会根据我们定义的宏来自动设置SCB->VTOR.代码从Flash启动的时候,取消VECT_TAB_SRAM,并且设置VECT_TAB_OFFSET为0。当代码从SRAM中启动的时候,定义VECT_TAB_SRAM,设置VECT_TAB_OFFSET为0x5000(也就是我们代码起始地址相对于0x2000_0000的偏移量)。使用Makefile来定义宏进行版本控制并不简单,但是可以链接不同的文件来达到这个目的。
' F1 j8 y% |) f/ J! }
9 G0 n" y6 }* _" ?! S4 M4 G1 w2 ?更改Makefile进行版本控制
+ L6 V8 w) F  x1 |拷贝stlib/system_stm32f30x.c到stlib/system_stm32f30x_sram.c。并按照上图更改VECT_TAB_SRAM,VECT_TAB_OFFSET.
7 w1 Y. z/ i3 e& j4 O修改Makefile如下:
8 W, u0 L9 }8 _! W: `% v/ k8 p 2015-10-29 18:30:33屏幕截图.png 2015-10-29 18:30:53屏幕截图.png
( U) n6 |5 H9 h: E在修改完Makefile之后,使用make clean,make sram,sudo make burn进行下载,测试之后发现字符已经能够回显。说明成功的进中断。在SRAM中运行代码成功。
. z5 x' \( Z+ r4 \7 s0 u* l! ]% L: E, j% k# u) Q
修改__io_getchar以适应backspace
3 t" o/ B8 \! z  m) K9 J6 |0 t在输入的时候,按下键盘的backspace之后,光标往前移动一个字符,并没有在屏幕上删除,类似于插入模式。我们想实际的删除一个字符,需要在屏幕上打印一个空格将之前的字符覆盖。废话少说,看代码:) ^( K5 m2 Q  V3 {" P" O4 W8 \
int __io_getchar(void)
8 _: H' N2 F$ Z. Z- \{
. }: \: a: n0 \5 x5 M5 E+ }    signed char ch;0 V( D( n- H/ @' W* G
    while(rbempty(&rb_usart)) continue;0 }( z. a$ V8 X" D8 _# s
    ch=rbget(&rb_usart);
  i* z8 X: p; \1 d0 ?9 m1 q* o    switch(ch)
% ~7 _' ]& S8 p  h& W/ [. i1 W    {0 Y/ s- c9 I( [
        case '\r':ch='\n';return __io_putchar(ch);
. V1 H% Z0 Y% @! F. ]        case 0x1b:ch=' '; return __io_putchar(ch);
: ^( N$ u4 \! m  F$ @        case 0x08:/* backspace in minicom or putty */
+ q& [& d% I8 I        case 0x7F:
+ B/ q3 D5 u& S% f& h! q            /* earse char in screen(replace with space
' ?$ x' X+ @9 `' C" _" e# U6 h             and return the backspace code */
8 k* w) V/ U+ {& ]/ `+ @1 A            __io_putchar(ch); __io_putchar(' ');__io_putchar(ch);
2 t  C9 K" j' k0 h            return ch;. n6 n; d& p4 t, A( z. w! r
        default: return __io_putchar(ch);
" [; N% w0 C) V  e" _    }% p) W& p( o3 e9 Y& K: j( ?# V
    $ v1 d% X, }0 L2 s- ~
    /* echo it */
7 b8 Z1 k: R) ?9 |' Y) `( \    return __io_putchar(ch);
- ~: u- B  Z! [: e}
. S6 D% F' @' y2 q
7 ?2 s5 c$ U/ R
_exit系统调用; w1 }" n! O6 v/ c7 z' @
从点亮led灯开始,我们就一直添加_exit这个系统调用。关于更加具体的东西并没有详细的说明。4 L& T: U+ j4 M# K7 p: h
当我们使用exit退出的时候,exit做一些清理工作之后,继续调用_exit。_exit的最后一行应该是个死循环,或者产生一个软件复位信号,让程序从头开始执行。exit是需要一个参数的,用于指示系统是不是正常结束。8 z6 x7 l7 j( _. f3 q4 W
void _exit(int status)
* l! H. _$ h2 C{
$ M# ?8 [4 `+ E8 z& l( _5 K$ n    const char *exit_str="GoodBye!\n";- W5 r& c2 Y) S# p5 J7 M9 |
    const char *tmp=exit_str;
$ H1 u- D2 X8 o% \, z8 _    for(;*tmp!='\0';tmp++)! f5 }7 X$ C0 u8 N. m, m% A5 k
        __io_putchar(*tmp);
. y- n1 V( q# B: ]    & P6 h1 p) \( K% I/ N2 a
    for(;;) continue;/ i- y- _* n% j& _6 s6 a
}/ w& b. Y. u) W8 A# G, t4 T

4 `: R% |8 ~! Y: P
但在主函数中,如果使用exit能够正常的调用_exit,但是主函数使用return xxx的时候,并不能调用_exit。如果想让main的返回值传递给_exit,需要更改启动文件。
5 b$ T3 B: c, Y! ?4 [9 E! W% W4 P, o; B% O- F. i. p3 u
( b" V$ m" Y2 d! ^
本次所有的代码都在serial_v4.zip文件中。; g: n% T! P* v0 C1 e+ G
2 N$ k2 T# h- z# x+ {: D6 k+ |

serial_v4.zip

下载

399.66 KB, 下载次数: 73

赞 收藏 1 评论15 发布时间:2015-10-29 18:44

举报

15个回答
神棍狗大侠 回答时间:2015-10-29 23:20:28
CUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢
aoxiangwode2008 回答时间:2015-10-30 08:20:38
大神,膜拜一下。
猪圈丶嗨情歌 回答时间:2015-10-30 08:24:19
好帖子,详细介绍Linux下开发的过程
你好我好大家好! 回答时间:2015-10-30 09:02:06
:):):):):)                  
limale 回答时间:2015-10-30 09:40:19
等板子到了好好玩玩。
qianfan 回答时间:2015-10-30 13:57:39
神棍狗大侠 发表于 2015-10-29 23:20
. B" j0 G9 Q$ `" oCUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢 ...

1 i, s  @) B" b这个没用过。我的电脑把windows软件刷掉了,只留下了ubuntu。这些软件都不能安装
qianfan 回答时间:2015-10-30 13:58:08
神棍狗大侠 发表于 2015-10-29 23:20) t* B* |: X1 h2 ~0 Y8 \, e0 m* `
CUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢 ...
# |3 e  v7 y6 `/ y8 M& m
可以去社区群问问。群里面不少用CUBE MX的。
qianfan 回答时间:2015-10-30 13:58:44
aoxiangwode2008 发表于 2015-10-30 08:200 ?  k; A$ s- C
大神,膜拜一下。

' v1 l! b; `! \3 f/ a0 v8 @! O你也可以几个月速成大婶的
qianfan 回答时间:2015-10-30 14:00:08
limale 发表于 2015-10-30 09:40
( F( L# @/ Y; g6 a: b等板子到了好好玩玩。
2 ]4 |6 b( Y% C. t6 F
刚开始学吗?刚开始学的话还是先尝试使用keil mdk或者rar吧。那些比较容易上手。
" j+ j9 \5 n$ A% t4 a如果已经是老手了,还是可以玩玩的。
神棍狗大侠 回答时间:2015-10-30 14:43:48
QianFan 发表于 2015-10-30 13:57
2 T2 ~& p7 X; C! C这个没用过。我的电脑把windows软件刷掉了,只留下了ubuntu。这些软件都不能安装 ...

" y. u: R- D) v8 h6 C. xSW4STM32及TRUESTUDIO 基于GCC的,应该有Linux版本。大神要不弄弄?
qianfan 回答时间:2015-10-30 14:46:57
神棍狗大侠 发表于 2015-10-30 14:43$ q3 Q# T7 v# z. U$ J9 o3 c. A
SW4STM32及TRUESTUDIO 基于GCC的,应该有Linux版本。大神要不弄弄?
% _: j9 v2 n; e
不知道有没有linux版本。像TrueStudio等都是用gcc和eclipse改的,不一样没linux版本。。。
wwwhlw 回答时间:2015-11-17 11:03:30
学习一下。。
swapkernel1111 回答时间:2018-6-29 17:33:43
GarfieldCat 回答时间:2019-10-16 09:12:53
看看,学学,谢谢,顶顶。
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版