家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生 家电维修班,手机维修班,电脑维修班,电工班,焊工班,液晶电视维修班,电动工具维修班、电动车摩托车维修班、网络营销培训、网站设计培训、淘宝培训---全国招生
您的位置:网站首页 > 电器维修资料网 > 正文 >

STM32:玩玩修改串口

★★★★★【文章导读】:STM32:玩玩修改串口具体内容是:这里的stm32_eval.c,stm32_eval.h文件,以及图中所示三个文件夹中任意一个文件夹中的部分文件复制到第一个图所示的文件夹中去,这里我们选择stm3210e_eval这个文件夹。需要复制的文件是stm3210e_eval.h如同前面一样…

来源: 日期:2013-12-5 10:33:17 人气:标签:

STM32:玩玩修改串口

  这里的stm32_eval.c,stm32_eval.h文件,以及图中所示三个文件夹中任意一个文件夹中的部分文件复制到第一个图所示的文件夹中去,这里我们选择stm3210e_eval这个文件夹。

  2.gif

  需要复制的文件是stm3210e_eval.h

  如同前面一样建立工程,并且注意修改stm32_eval.h的内容

  

  将//#define use_stm3210e_eval 前的#去掉。

  这样,就可以编译并通过文件,用软件仿真,在usart #1窗口显示出

  usart printf example: retarget the c library printf function to the usart

  这样一行字了。

  显然,对这样的玩法我是不会满意的,下面试着去掉与stm32e_eval等相关文件,把这里面需要用到的函数直接复制到main中去,同时,也了解一些串口设置的知识。

  学到这里,多少有点明白了,stm提供的库为了达到通用性的要求,用了很多的符号来替代常量,然后七转八拐,有时不知要转多少个弯才能找到最终对寄存器操作的代码。这时,keil提供的符号浏览就很有用处了。方法是在将光标移到需要查看的符号上面,按下f12即可,通常可以直接跳转到所需查看到的符号的出处。如下图

  

  将光标移到usart_baudrate处,按下f12,即跳转到stm32f10x_uart.h文件中相应的定义处:

  

  如果stm32f10x_uart.h文件没有打开,那么这个动作会自动打开这个文件。

  下面我们将eval板相关的函数复制到main函数中,以便丢掉与eval板相关的文件。

  (1)打开stm32_eval.h文件,将

  typedef enum

  {

  com1 = 0,

  com2 = 1

  } com_typedef;

  复制到main.c中,这是用来选择哪一个串口的,因为我的板子上也有2个串口,所以就把它复制过来,也省得对函数作较大的修改了。

  (2)打开stm32_eval.c文件,有一个

  void stm_eval_cominit(com_typedef com, usart_inittypedef* usart_initstruct)

  的函数,是用来初始化端口的,我们把它复制到main.c中,并且把它改名为

  void stm_cominit(com_typedef com, usart_inittypedef* usart_initstruct)

  去掉中间的eval。

  当然,在main函数中调用这个函数的地方也要做相应的修改。

  1.gif

  这个函数中用到了如上图中蓝色框中的一些符号,又是一系列的转换,用刚才所说的跟踪方法,找到这些符号的原始出处,作出修改,最后得到的stm_cominit函数如下:

  void stm_cominit(com_typedef com, usart_inittypedef* usart_initstruct)

  {

  gpio_inittypedef gpio_initstructure;

  /* 打开uart所用到的gpio引脚的时钟*/

  rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_afio, enable);

  /* 打开uart的时钟*/

  if (com == com1)

  {

  rcc_apb2periphclockcmd(rcc_apb2periph_usart1, enable);

  }

  else //com=com2

  {

  rcc_apb1periphclockcmd(rcc_apb1periph_usart2, enable);

  }

  /* 配置tx引脚为推挽式输出 */

  if(com==com1)

  gpio_initstructure.gpio_pin = gpio_pin_9 ;

  else

  gpio_initstructure.gpio_pin = gpio_pin_2;

  gpio_initstructure.gpio_mode = gpio_mode_af_pp;

  gpio_initstructure.gpio_speed = gpio_speed_50mhz;

  gpio_init(gpioa, &gpio_initstructure);

  /* 配置rx引脚为浮动输入(高阻?) */

  if(com==com1)

  gpio_initstructure.gpio_pin = gpio_pin_10 ;

  else

  gpio_initstructure.gpio_pin = gpio_pin_3;

  gpio_initstructure.gpio_mode = gpio_mode_in_floating;

  gpio_init(gpioa, &gpio_initstructure);

  /* 串行口配置*/

  if(com==com1)

  usart_init(usart1, usart_initstruct);

  else

  usart_init(usart2, usart_initstruct);

  /* 串口允许*/

  if(com==com1)

  usart_cmd(usart1, enable);

  else

  usart_cmd(usart2, enable);

  }

  至此,修改基本结束,在工程中移去stm32_eval相关的各个文件,在app文件夹中将这些文件删除,关闭工程,再重新打开工程,编译通过,运行通过。

下面对上述初始化工作做一些解读,当然,少不了要数据手册的帮忙了。

  (1)uart1的时钟来源和其他串口的时钟来源不同,uart1的时钟来源是:apb2,其他串口的时钟来源:apb1。

  (2)用于uart通信的引脚不会自动配置,需要手工配置。其中用于输出信号的引脚tx必须配置成为推挽式输出,而rx引脚则配置成浮动型输入。

  (3)串口波特率、停止位等参数由库提供的stm32f10x_usart.c中的

  void usart_init(usart_typedef* usartx, usart_inittypedef* usart_initstruct)

  函数来设定。

  观察这个函数的执行,可以看到函数通过对cr2寄存器的操作来设定停止位,如下图蓝色框中所示。

  

  通过对cr1寄存器的设定来确定数据位/奇偶校验位等,这些都只需要找到相应的符号,就能顺利地进行设置,找到符号的方法,当然还是上面的按f12浏览的方法。

  还有一个重要的工作是波特率的计算,且看这里是如何来做的。

  下面这一段是波特率设置的代码

  2.gif

  首先根据usartxbase的值来确定需要配置的是usart1还是usart2

  usartxbase = (uint32_t)usartx;

  而usartx是传入这个函数的一个参数。

  然后据此来得到用于usart的时钟频率,这个频率值被变量apbclock记录。

  1.gif

  从上面变量的跟踪可以看到apbclock的值是0x44aa200即72000000,也就是72mhz。

  接下来的一系列计算式就是根据波特率的值来计算应该传入brr寄存器的值了,偷点懒,这里就不对算式进行一一分析了(我认为暂时没有这个必要)。

  至此,usart的设置工作完成,即完成了其数据位、停止位、奇偶校验位、波特率的设置工作。异步通信的配置工作完成。当然,细细分析,可以发现,初始还按默认方式处理了硬件握手等的处理工作。

  除了使用库函数提供的printf等函数外,我们在单片机开发中还经常使用直接对数据寄存器赋值的方法来使用串口。stm32串口的数据寄存器名为dr,因此,我试着在main函数中写入这样一行:

  while1()

  { usart1-》dr=0x55;

  }

  一试成功,软件仿真时,在串行窗口出现了大串的字符55.

  好了,串口暂时告一段落。


【看看这篇文章在百度的收录情况】

联系方式

  • 0731-85579057 , 0731-85569651
  • 点击这里给我发消息点击这里给我发消息点击这里给我发消息
网站栏目导航: 培训课程 手机硬件 手机软件 综合维修 学校资讯 考证指南 就业导航 招生指南 教学管理 入学须知 学校图片 教学大纲 师资力量 学生感言 学校概况 教学实景 手机维修培训资讯 电脑维修培训 维修间故事 手机维修培训 液晶电视维修培训 家电维修资料网 电器维修资料网 招生地区 刷机教程 家电维修 手机技巧 老版网站 招生平台网络工程
友情链接: 监控安装培训 电动工具维修 家电维修学校 电工培训学校 液晶电视维修 焊工培训学校 电工焊工学校 电脑维修学校 家电维修培训 电脑维修培训 家装电工培训网络安装维护 主板维修 液晶显示器 笔记本电脑维修 电脑组装维护 电脑硬件维修 电脑维修 电工考证 电工证 装修电工 水电工 维修电工 电工 焊接技术 电焊工 焊工 电动设备维修 电动工具维修 制冷维修 空调维修 冰箱维修  更多>>
阳光-手机维修教育品牌学校
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校 电工培训学校 电动车维修学校 摩托车维修学校 摩托车维修培训 手机维修培训 家电维修培训 电脑维修培训 电动工具维修培训 液晶电视维修培训 安防监控培训 空调维修培训 网络营销培训 网站设计培训 淘宝网店培训 电器维修培训 家电维修学校 电工培训 焊工培训 电工学校
中山市,固原市,银川市,玉树,海东,陇南市,酒泉市,张掖市,天水市,金昌市,兰州市,榆林市,延安市,渭南市,铜川市,阿里,山南,拉萨市,怒江,文山州,楚雄州,普洱市,昭通市,玉溪市,昆明市,毕节,铜仁,遵义市,贵阳市,甘孜州,资阳市,达州市,宜宾市,南充市,遂宁市,绵阳市,泸州市,自贡市,三亚市,崇左市,河池市,玉林市,钦州市,梧州市,柳州市,梅州市,肇庆市,湛江市,佛山市,珠海市,韶关市,湘西州,怀化市,郴州市,张家界市,邵阳市,株洲市,仙桃市,随州市,荆州市,荆门市,襄樊市,黄石市,驻马店市,信阳市,南阳市,漯河市,中卫市,石嘴山市,海西,海南藏州,黄南州,海北,甘南,庆阳市,平凉市,武威市,白银市,嘉峪关市,安康市,汉中市,咸阳市,宝鸡市,林芝,日喀则,昌都,迪庆,德宏,大理,西双版纳,红河州,临沧市,丽江市,保山市,曲靖市,黔东州,黔西州,安顺市,六盘水市,凉山州,阿坝州,雅安市,广安市,眉山市,内江市,广元市,德阳市,攀枝花市,成都市,海口市,来宾市,百色市,贵港市,北海市,桂林市,南宁市,云浮市,揭阳市,潮州市,清远市,阳江市,汕尾市,惠州市,茂名市,江门市,汕头市,深圳市,广州市,娄底市,永州市,益阳市,岳阳市,湘潭市,长沙市,恩施州,黄冈市,孝感市,鄂州市,十堰市,武汉市,周口市,商丘市,三门峡市,许昌市,焦作市,安阳市,鹤壁市,平顶山市,开封市,郑州市,聊城市,滨州市,德州市,莱芜市,日照市,泰安市,烟台市,潍坊市,东营市,淄博市,上饶市,济南市,抚州市,宜春市,赣州市,新余市,九江市,景德镇市,宁德市,南平市,泉州市,莆田市,厦门市,宣城市,亳州市,六安市,宿州市,黄山市,滁州市,安庆市,淮北市,马鞍山市,蚌埠市,芜湖市,合肥市,丽水市,舟山市,衢州市,金华市,湖州市,嘉兴市,宁波市,宿迁市,镇江市,盐城市,连云港市,苏州市,徐州市,南京市,绥化市,牡丹江市,佳木斯市,大庆市,鹤岗市,哈尔滨市,白城市,白山市,辽源市,吉林市,葫芦岛市,铁岭市,盘锦市,阜新市,锦州市,本溪市,鞍山市,沈阳市,锡林郭勒盟,通辽市,乌海市,吕梁市,忻州市,晋中市,晋城市,阳泉市,太原市,廊坊市,承德市,保定市,邯郸市,唐山市,宁夏,甘肃省,西藏,贵州省,重庆市,广西,湖南省,河南省,江西省,安徽省,江苏省,黑龙江省,辽宁省,山西省,天津市,四平市,内蒙古,吴忠市,果洛,西宁市,定西市,商洛市,西安市,那曲,黔南州,巴中市,乐山市,贺州市,防城港市,东莞市,河源市,常德市,衡阳市,咸宁市,宜昌市,濮阳市,新乡市,洛阳市,菏泽市,临沂市,威海市,济宁市,枣庄市,青岛市,吉安市,鹰潭市,萍乡市,南昌市,龙岩市,漳州市,三明市,福州市,池州市,巢湖市,阜阳市,铜陵市,淮南市,台州市,绍兴市,温州市,杭州市,泰州市,扬州市,淮安市,南通市,常州市,无锡市,大兴安岭,黑河市,七台河市,伊春市,双鸭山市,鸡西市,齐齐哈尔市,延边,松原市,通化市,长春市,朝阳市,辽阳市,营口市,丹东市,抚顺市,大连市,阿拉善盟,兴安盟,乌兰察布市,巴彦淖尔市,呼伦贝尔市,鄂尔多斯市,赤峰市,包头市,呼和浩特市,临汾市,运城市,朔州市,长治市,大同市,衡水市,沧州市,张家口市,邢台市,秦皇岛市,石家庄市,青海省,陕西省,云南省,四川省,海南省,广东省,湖北省,山东省,福建省,浙江省,上海市,吉林省,河北省,北京市