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

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

[复制链接]
qianfan 发布时间:2015-10-29 18:44
本帖最后由 QianFan 于 2015-10-29 18:51 编辑
8 S/ `$ p' B% P0 Q0 @7 B: j4 f
- z, q5 f2 P/ F- {1 _( D    在上一篇Part1的时候,我们说了有个bug,也就是中断向量表的问题。其实这个问题在第4节---在SRAM中运行程序的时候就存在。只不过我们的程序中没有使用中断,也就导致这个bug没有发现。如果我们在上一节的代码中尝试将程序下载到SRAM中运行的时候,也就是make sram,sudo make burns,这样串口只能发送。不能接收。究其原因还是中断惹得祸。* t5 \5 y7 l" C" b# T* ~6 Y
    我们使用st-flash工具直接将代码下载到SRAM中,st-flash在下载完之后,会尝试更改pc到Reset_Handler。并运行第一行代码。但是当我们的中断来了之后,该区何处寻找中断向量呢?我们仅仅改了PC的值,并没有改中断向量表的值。也就导致中断来临时,跳转到了错误的中断向量中。(应该是0x0800_0000处中断向量表中对应的位置)
) Z* }2 L  v- E5 \# @$ E4 P! z
) u& ?4 e; Q( l, {$ w8 u$ r3 @, B如何更改中断向量表?; Q0 u/ I% C3 U6 V# q2 R
更改中断向量表,需要更改SCB->VTOR。关于他的解释请参考《ARM Cortex-M3权威指南》或者网址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203hc/Cihdidh2.html+ }$ s* I" U- }: h) L
2015-10-29 18:05:15屏幕截图.png # {8 \! [+ u5 p
& t' f+ u# P- r
在system_stm32f30x.c中,有这样的代码:' e: ~1 V8 ~  r& K0 ]( c
2015-10-29 18:18:45屏幕截图.png 2015-10-29 18:19:00屏幕截图.png & d* a$ n" e  ?! m+ R$ O: w/ ], x7 F
这个文件会根据我们定义的宏来自动设置SCB->VTOR.代码从Flash启动的时候,取消VECT_TAB_SRAM,并且设置VECT_TAB_OFFSET为0。当代码从SRAM中启动的时候,定义VECT_TAB_SRAM,设置VECT_TAB_OFFSET为0x5000(也就是我们代码起始地址相对于0x2000_0000的偏移量)。使用Makefile来定义宏进行版本控制并不简单,但是可以链接不同的文件来达到这个目的。) n/ u. F6 x1 `5 E+ o* @) @

9 k& b  m2 H$ Y( N2 Z更改Makefile进行版本控制
4 y' \! y4 \4 Y9 k% S7 D拷贝stlib/system_stm32f30x.c到stlib/system_stm32f30x_sram.c。并按照上图更改VECT_TAB_SRAM,VECT_TAB_OFFSET.& ]! a9 x$ d) ^
修改Makefile如下:+ K# ?  E/ `/ Y
2015-10-29 18:30:33屏幕截图.png 2015-10-29 18:30:53屏幕截图.png 9 V. r' r* d" [* P0 g$ a% b0 k
在修改完Makefile之后,使用make clean,make sram,sudo make burn进行下载,测试之后发现字符已经能够回显。说明成功的进中断。在SRAM中运行代码成功。0 d0 f8 d9 S  [- l9 f, P

( U" Z/ ?2 p8 A& [; T% x修改__io_getchar以适应backspace- J. g  l- n& w  H, |9 M
在输入的时候,按下键盘的backspace之后,光标往前移动一个字符,并没有在屏幕上删除,类似于插入模式。我们想实际的删除一个字符,需要在屏幕上打印一个空格将之前的字符覆盖。废话少说,看代码:
  H5 s) W  }- mint __io_getchar(void)9 X7 {& R9 w, x% t- L
{1 K. G9 A! S# v  e; y1 l
    signed char ch;! Z. J% Q+ @9 X. H4 D
    while(rbempty(&rb_usart)) continue;  N; s5 j' F# @+ O
    ch=rbget(&rb_usart);3 |. ?4 I3 n; k4 Z
    switch(ch)& A1 c# ~  L8 E$ ?, d% E
    {/ Q: E  M9 ?3 b  \
        case '\r':ch='\n';return __io_putchar(ch);9 i+ X. O1 n9 H1 Y9 G: _6 S# p
        case 0x1b:ch=' '; return __io_putchar(ch);
. ?% u  T. f! L0 `        case 0x08:/* backspace in minicom or putty */
. N4 D% c: F0 D2 I        case 0x7F:
8 d! c; r2 }: x            /* earse char in screen(replace with space
. k" @: Q8 h% W- [% ~6 A0 ]             and return the backspace code */
/ \9 h  ]$ Y1 t: A  ]: |            __io_putchar(ch); __io_putchar(' ');__io_putchar(ch);1 Z+ X& l! o7 z  T) u# R
            return ch;
9 J, e& w7 S. }* w3 S& w- X, X        default: return __io_putchar(ch);" S8 }# j4 h; x& ^$ c+ t( o& ?& t! v
    }
  U) u' q( x1 ~" T; V  }   
8 B, t& R4 N8 }& `( q    /* echo it */9 G' S% P" w. M3 P
    return __io_putchar(ch);+ E/ R* ^0 f1 y
}
: b" c+ I6 r1 C/ Z: H/ V" N
/ e6 A& G0 u( F. p# @) A
_exit系统调用0 n. n) Y0 o4 r- o6 v: x, j
从点亮led灯开始,我们就一直添加_exit这个系统调用。关于更加具体的东西并没有详细的说明。+ I, o8 @5 ^) p* S- O
当我们使用exit退出的时候,exit做一些清理工作之后,继续调用_exit。_exit的最后一行应该是个死循环,或者产生一个软件复位信号,让程序从头开始执行。exit是需要一个参数的,用于指示系统是不是正常结束。( C+ U. {% e6 k5 F2 v! f
void _exit(int status)
* @5 }& y3 h( V. N8 k. P{$ W. c( D8 R8 q3 r. w
    const char *exit_str="GoodBye!\n";* s) g2 [/ X( m4 D5 X/ R7 X5 M
    const char *tmp=exit_str;
" P  t- F( _6 p2 d! d    for(;*tmp!='\0';tmp++)& L; O5 X& y$ u- g4 N
        __io_putchar(*tmp);& n% s: z1 ^- j
    # ^6 p0 P* W; R
    for(;;) continue;1 T3 b0 W  b+ z3 s" n8 P" p
}! W- d# g; Q! ?4 a# y
$ ~2 U: b) ]* j. g, @
但在主函数中,如果使用exit能够正常的调用_exit,但是主函数使用return xxx的时候,并不能调用_exit。如果想让main的返回值传递给_exit,需要更改启动文件。
: w+ v2 {& V, q  V" B! ~0 p0 h$ s# C. }' E0 a: w
8 o* B) c# @( c$ V# C+ k. V9 o
本次所有的代码都在serial_v4.zip文件中。/ L0 D7 c9 v6 G2 q

, N7 M" |8 d+ g, y/ w) Q% ], C

serial_v4.zip

下载

399.66 KB, 下载次数: 72

收藏 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' b5 q% ?. h  W" e2 r' n# J
CUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢 ...
, K4 k3 t% w, n0 H- Y
这个没用过。我的电脑把windows软件刷掉了,只留下了ubuntu。这些软件都不能安装
qianfan 回答时间:2015-10-30 13:58:08
神棍狗大侠 发表于 2015-10-29 23:202 l' @* G( r/ d" U# U- k5 M
CUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢 ...

3 V$ j, y, j. \& _6 l) I+ }可以去社区群问问。群里面不少用CUBE MX的。
qianfan 回答时间:2015-10-30 13:58:44
aoxiangwode2008 发表于 2015-10-30 08:20
* @5 G  v5 M0 M( `; U( L大神,膜拜一下。

4 [" c2 L$ H' |3 F' i$ _8 k你也可以几个月速成大婶的
qianfan 回答时间:2015-10-30 14:00:08
limale 发表于 2015-10-30 09:400 ~) C& y# F. `/ X; q- E7 ?) S
等板子到了好好玩玩。
+ y0 C; a- h1 x1 |" h+ @
刚开始学吗?刚开始学的话还是先尝试使用keil mdk或者rar吧。那些比较容易上手。
4 F8 A& @7 b4 U如果已经是老手了,还是可以玩玩的。
神棍狗大侠 回答时间:2015-10-30 14:43:48
QianFan 发表于 2015-10-30 13:57
: _5 c9 u0 e. T& U$ E这个没用过。我的电脑把windows软件刷掉了,只留下了ubuntu。这些软件都不能安装 ...
# E$ w( P1 ^/ o& `
SW4STM32及TRUESTUDIO 基于GCC的,应该有Linux版本。大神要不弄弄?
qianfan 回答时间:2015-10-30 14:46:57
神棍狗大侠 发表于 2015-10-30 14:43) L* C& M, b/ F5 z1 f4 ~- \+ T
SW4STM32及TRUESTUDIO 基于GCC的,应该有Linux版本。大神要不弄弄?

. {: F6 g7 i: z' X: w: ?0 `不知道有没有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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版