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

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

[复制链接]
qianfan 发布时间:2015-10-29 18:44
本帖最后由 QianFan 于 2015-10-29 18:51 编辑   y& d/ ?/ q; M; `% e
1 t" Y6 `# x  z* y2 W& |' G5 m
    在上一篇Part1的时候,我们说了有个bug,也就是中断向量表的问题。其实这个问题在第4节---在SRAM中运行程序的时候就存在。只不过我们的程序中没有使用中断,也就导致这个bug没有发现。如果我们在上一节的代码中尝试将程序下载到SRAM中运行的时候,也就是make sram,sudo make burns,这样串口只能发送。不能接收。究其原因还是中断惹得祸。5 W$ L1 ?' I& `% j- k8 r% U
    我们使用st-flash工具直接将代码下载到SRAM中,st-flash在下载完之后,会尝试更改pc到Reset_Handler。并运行第一行代码。但是当我们的中断来了之后,该区何处寻找中断向量呢?我们仅仅改了PC的值,并没有改中断向量表的值。也就导致中断来临时,跳转到了错误的中断向量中。(应该是0x0800_0000处中断向量表中对应的位置)( [4 ]: U" C, @0 ^
+ K# a9 K) s) h# L# @
如何更改中断向量表?
( M2 N& Z( i3 f/ Z! F; D更改中断向量表,需要更改SCB->VTOR。关于他的解释请参考《ARM Cortex-M3权威指南》或者网址:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203hc/Cihdidh2.html 。- n) F) e# ]( j
2015-10-29 18:05:15屏幕截图.png 2 ?0 d& ^1 i  G* d6 O% _

. m, c1 ^. ~% S% k; n在system_stm32f30x.c中,有这样的代码:
. P4 V* g5 V+ v/ n' o" v+ d 2015-10-29 18:18:45屏幕截图.png 2015-10-29 18:19:00屏幕截图.png
! @, @& a' X) z这个文件会根据我们定义的宏来自动设置SCB->VTOR.代码从Flash启动的时候,取消VECT_TAB_SRAM,并且设置VECT_TAB_OFFSET为0。当代码从SRAM中启动的时候,定义VECT_TAB_SRAM,设置VECT_TAB_OFFSET为0x5000(也就是我们代码起始地址相对于0x2000_0000的偏移量)。使用Makefile来定义宏进行版本控制并不简单,但是可以链接不同的文件来达到这个目的。
0 z% o! l7 p! S" I1 ]1 n5 W$ j; e. C* X1 c4 u. i; [% t! z
更改Makefile进行版本控制3 y; {, o, @/ z! w+ y" ~1 T
拷贝stlib/system_stm32f30x.c到stlib/system_stm32f30x_sram.c。并按照上图更改VECT_TAB_SRAM,VECT_TAB_OFFSET.. n; k- n; \; g" f0 X" \/ P
修改Makefile如下:; I3 b* x+ }3 O7 G% R( I
2015-10-29 18:30:33屏幕截图.png 2015-10-29 18:30:53屏幕截图.png 5 K6 g  e) k' e# b3 l, E5 H
在修改完Makefile之后,使用make clean,make sram,sudo make burn进行下载,测试之后发现字符已经能够回显。说明成功的进中断。在SRAM中运行代码成功。' Z0 ]9 ?7 t0 k, ~* R6 A; }

% S3 U7 |) m4 k$ P% Y7 d- _修改__io_getchar以适应backspace
$ I2 Q+ J& H! V4 W9 W在输入的时候,按下键盘的backspace之后,光标往前移动一个字符,并没有在屏幕上删除,类似于插入模式。我们想实际的删除一个字符,需要在屏幕上打印一个空格将之前的字符覆盖。废话少说,看代码:
1 D# V0 `4 Z0 c6 z) c3 sint __io_getchar(void)' \8 U0 X  l: I3 L" P
{
, T+ ^& \( C1 J. |% C9 ]8 W1 `5 h! b5 d- _    signed char ch;
" `. ]% L$ k9 N1 G  Z  ?; ?    while(rbempty(&rb_usart)) continue;
; a+ [+ i4 h7 K2 @# A8 J$ U. j% j3 c    ch=rbget(&rb_usart);
; ~/ S" n. @0 E" I. [  L) O. p3 k6 z8 x    switch(ch)
; {( Q# Z' I. t5 X' {6 q    {7 a  s) h. b% U: t/ {' Q0 S
        case '\r':ch='\n';return __io_putchar(ch);
+ c0 t2 @' u9 \. J1 i) }. W        case 0x1b:ch=' '; return __io_putchar(ch);8 p1 {) ?; }$ R( i  x
        case 0x08:/* backspace in minicom or putty */7 s6 ?% X: i2 p- d2 T  d
        case 0x7F: % m3 x' T  i$ \( H& O, U; ~
            /* earse char in screen(replace with space
3 N' j7 @) g6 `) i$ q7 T             and return the backspace code */
* a1 N3 c2 n  z            __io_putchar(ch); __io_putchar(' ');__io_putchar(ch);2 I( Y! h- W7 J# a0 d  c2 U
            return ch;/ y1 v4 J  O( R& C. L8 E
        default: return __io_putchar(ch);
  L9 T- s% T+ ?* B# k    }" k* \8 `  W/ z: Z9 h
   
5 `, u  z" s. S: V7 E3 A) {) C    /* echo it */+ p3 k# {5 E3 V+ [& P
    return __io_putchar(ch);
3 l* \3 D' h3 A8 R: i- I}
6 E  D: @1 T* D7 [
% Y0 p5 |( Y% {
_exit系统调用
" ?- n% l% y6 Y% G! I; |从点亮led灯开始,我们就一直添加_exit这个系统调用。关于更加具体的东西并没有详细的说明。2 v8 g$ q- H) Y
当我们使用exit退出的时候,exit做一些清理工作之后,继续调用_exit。_exit的最后一行应该是个死循环,或者产生一个软件复位信号,让程序从头开始执行。exit是需要一个参数的,用于指示系统是不是正常结束。7 X) ?" U- A2 \
void _exit(int status)8 i$ J3 J+ J; \8 V
{5 P0 W5 `0 N) c& x! B0 o$ u" {! J
    const char *exit_str="GoodBye!\n";
3 w! v" k/ O7 f8 F    const char *tmp=exit_str;
2 v( O7 m8 u# o7 ^: F    for(;*tmp!='\0';tmp++)
& R6 ^9 k' h+ O! f        __io_putchar(*tmp);* c9 n9 q4 S- y" _0 F% ?
   
# P* z8 g3 \$ D3 w    for(;;) continue;
+ h$ R' W9 c7 r4 T7 I7 r}
! F0 O) [, m+ f9 K1 F; Q8 A2 Q5 C! j" |, U: A% S, g) }' a
但在主函数中,如果使用exit能够正常的调用_exit,但是主函数使用return xxx的时候,并不能调用_exit。如果想让main的返回值传递给_exit,需要更改启动文件。
: s: S5 R' q# c5 _& e+ D% y) t" T: O5 ~: F9 K, P. o( X3 \

: Z, E7 R% x4 y' o本次所有的代码都在serial_v4.zip文件中。' @( |& k  A6 c2 Z9 Z7 e9 {

. W$ ]: L; K& e, V  V

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
5 E1 y9 x3 X) O4 DCUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢 ...
3 Y6 E0 `, d0 @4 r4 h4 }
这个没用过。我的电脑把windows软件刷掉了,只留下了ubuntu。这些软件都不能安装
qianfan 回答时间:2015-10-30 13:58:08
神棍狗大侠 发表于 2015-10-29 23:20
+ O( ?/ D) R1 C: q5 S% m) BCUBE MX生成的 SW4STM32工程及TRUESTUDIO 工程在各自IDE里编译都遇上问题 大神有没有空出个小白教程呢 ...
: s4 q+ ^( z& t% M8 ?8 x
可以去社区群问问。群里面不少用CUBE MX的。
qianfan 回答时间:2015-10-30 13:58:44
aoxiangwode2008 发表于 2015-10-30 08:20( r0 A: r$ E0 ^( d' E
大神,膜拜一下。
; L: ^# I8 P7 h8 ?- j; _* k
你也可以几个月速成大婶的
qianfan 回答时间:2015-10-30 14:00:08
limale 发表于 2015-10-30 09:40! R; w; R: z% g" c8 c7 O6 v7 L/ f
等板子到了好好玩玩。
$ |1 R# M) ?- a' c& L2 }
刚开始学吗?刚开始学的话还是先尝试使用keil mdk或者rar吧。那些比较容易上手。
/ o+ m5 q- {! S" Y如果已经是老手了,还是可以玩玩的。
神棍狗大侠 回答时间:2015-10-30 14:43:48
QianFan 发表于 2015-10-30 13:57- `  Z1 y, }1 S. e! Q6 f- X
这个没用过。我的电脑把windows软件刷掉了,只留下了ubuntu。这些软件都不能安装 ...
. R- g7 o+ g$ x4 o; |
SW4STM32及TRUESTUDIO 基于GCC的,应该有Linux版本。大神要不弄弄?
qianfan 回答时间:2015-10-30 14:46:57
神棍狗大侠 发表于 2015-10-30 14:43
' k' b! ^# F$ p- Q% t7 VSW4STM32及TRUESTUDIO 基于GCC的,应该有Linux版本。大神要不弄弄?
' _# n4 y9 z* v! }
不知道有没有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 手机版