ecos stm32 步步深入8 - 手工打造串口usart2驱动实验ecos中断

最近忙别的事情,很长时间没碰ecos了,这两天有点空,抽空写个串口驱动玩玩,也验证一下ecos的中断调用。LZ花了两天时间写好这个驱动,中间遇到了几个比较恶心的问题,后来发现是前面的基础没打好,所幸都解决了。

尽管ECOS已经写好了串口的驱动程序,只需要在配置工具中使能即可。不过别人写的毕竟不是自己的,还是自己写的用的方便,这次试验的主要目的是为了调试ecos的中断服务,让串口中断能收发数据。

首先遇到的最大的问题,事实上跟什么串口都没关系,就是debug时一执行task delay,调试程序就收到停止命令,所有寄存器都不能正确读出。反复花了很长时间去定位原因,开始我怀疑是thread没正确设置,用gdb各种配置thread,时好时坏,看来不是问题的根本。后来我又怀疑是JLINK仿真器有问题,实验了不同的版本,最后还是升级到正版的最新的程序。在网上搜索相关的错误,没什么有价值的内容。这里严重鄙视我天朝的网络,google他妈的都用不了,搜英文得用bing了。后来无意中在打开gdb server时候看到可以选择芯片类型,默认的是cortexm3,就选择了stm32f103ze,没想到问题就这么解决了。我在gdb
server的脚本中已经指定了芯片信号命令,看来没有起作用,一定要在开始的时候就选好目标芯片型号。至此,调试时程序不会无缘无故的退出了。

这里说两句题外话,LZ以前看代码用source insight,写代码用slickedit,不过现在公司没买source insight的license,就没法使用了。slickedit是10年前版本的license,应该没有什么限制,仍然用原来公司的license。结果是最近搞ecos要大量读操作系统源码,没有好的工具真是急死人啊。后来发现其实slickedit也是超级好用的查看代码工具,只不过定位不像source insight那么方便,但其实习惯了也非常好用。现在也习惯用slickedit编辑浏览代码,非常方便,不愧是最贵的编辑工具。

上面gdb调试基础打好之后,又有了之前gpio驱动的经验,写串口驱动就非常容易了。代码基本上都是原来写过的,复制黏贴就行,把st的库文件usart加上。在配置串口时添加上中断响应函数

static Cyg_ErrNo usart_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void* buf, cyg_uint32 *len)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    USART_InitTypeDef u_info;
    Usart_Info_t *info = (Usart_Info_t *)buf;

    USART_DeInit( USART2);
    ConvertSerial2UartInfo(info->b, info->p, info->d, info->s , &u_info);
    USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
    USART_Cmd(USART2, DISABLE);
    USART_Init(USART2, (USART_InitTypeDef *)&u_info);

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // create ISR & DSR
<span style="color:#FF6666;">    cyg_interrupt_create(CYGNUM_HAL_INTERRUPT_UART2, 0x80, 0, &usart2_ISP, &usart2_DSR, &int_usart_handle, &int_usart);
    cyg_interrupt_attach(int_usart_handle);
    cyg_interrupt_unmask(CYGNUM_HAL_INTERRUPT_UART2);</span>

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART2, ENABLE);
    return ENOERR;
}
static cyg_uint32 usart2_ISP(cyg_uint32 vector, CYG_ADDRWORD data)
{
	//cyg_interrupt_mask(vector);
	cyg_interrupt_acknowledge( vector );

	if ( USART_GetITStatus(USART2, USART_IT_RXNE) == SET )
    {
        USART_ClearITPendingBit(USART2, USART_IT_RXNE);
        UART2RxISR();
    }
    if ( USART_GetITStatus(USART2, USART_IT_TXE) == SET )
    {
        USART_ClearITPendingBit(USART2, USART_IT_TC);
        UART2TxISR();
    }
    //cyg_interrupt_unmask(vector);
	return (CYG_ISR_HANDLED);
}

其他过程跟GPIO差不多,LZ遇到了有中断响应但无数据发出的问题,后来发现是初始化时候可复用的引脚配置不对造成的,仔细检查配置即可。

开始过程总是比较痛苦的,会遇到这样或那样的问题,有些时候的确不知道该如何解决,但随着一个一个问题的解决,你就会获得大量的实践经验,这就是为什么不同的人工作效率不同的原因。高手为什么是一般工程师工作效率的5-10倍,除了天赋之外,更重要的是建立在大量编程实践的基础之上,那些只看书不操作的人基本上只会是纸上谈兵,这也是我面试软件工程师一定要出一道上机题目的原因。最近看了一些案例,发点感慨,空谈误国,空谈误国。

ecos stm32 步步深入8 - 手工打造串口usart2驱动实验ecos中断

时间: 2024-10-04 22:31:48

ecos stm32 步步深入8 - 手工打造串口usart2驱动实验ecos中断的相关文章

网友纯手工打造摇摆LED时钟 ,牛!

手工打造摇摆LED时钟 ,牛! 摇摆LED 时钟,感觉非常新颖独特,正在玩单片机的我,激起了自己也想DIY 一个的冲动.不就是一个流水灯吗?有什么难的?! 于是,一个单片机项目就这样开始了.然而动手以后才知道问题并非想象那样简单,因没有任何现成的资料,机械的.电子的和编程的问题一大堆,一个一个需要自己来解决.经历二十多天的苦战和无数次的修改与调试,作品终于完成,基本达到预先要求.    现将制作资料整理出来,与广大DIY 爱好者分享. 一. 整体方案    本制作是根据视觉暂留原理, 让一排8

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

一年纯手工打造的Java老A上册开始预售了

Java老A这本书写了很久,昨天终于开始在china-pub上开始预售了,其它网站可能会慢一点,不过既然叫预售,就肯定还没到货. 有兴趣的人可以去看看哈(后续其它网站地址也会在这里公开): http://search.china-pub.com/s/?key1=java%cc%d8%d6%d6%b1%f8&type=&pz=1 关于本书内容,请参考:http://blog.csdn.net/xieyuooo/article/details/38373409 里面有本书的所有目录信息,封面等

纯手工打造简单分布式爬虫(Python)

前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试.这次打造的分布式爬虫采用比较简单的主从模式,完全手工打造,不使用成熟框架,基本上涵盖了前六章的主要知识点,其中涉及分布式的知识点是分布式进程和进程间通信的内容,算是对Python爬虫基础篇的总结. 现在

IOS学习之道:使用UIButton纯手工打造的黑白快小游戏.

由于代码量比较多,有兴趣的同学可以去我的资源页进行下载. http://download.csdn.net/detail/tx874828503/8637445 使用UIButton纯手工打造的黑白快小游戏.请勿商业使用,转载请注明出处,谢谢

手写MyBatis,纯手工打造开源框架(第四篇:决胜千里)- 第272篇

说明 MyBatis版本:3.5.1 相关历史文章(阅读本文之前,您可能需要先看下之前的系列) Spring Boot MyBatis最全教程:你值得拥有MyBatis能脱离Spring吗一图纵览MyBatis的工作原理从源码看MyBatis,竟如此简单MyBatis的Mapper是什么`垃圾` 手写MyBatis,纯手工打造开源框架(第一篇:风云再起) 手写MyBatis,纯手工打造开源框架(第二篇:君临天下) 手写MyBatis,纯手工打造开源框架(第三篇:运筹帷幄) 前言        运

stm32f10x串口实验之中断模式

1.在使用一个内置外设的时候,我们首先要使能相应的 GPIO 时钟,然后使能复用功能时 钟和内置外设时钟.注意设置时,要使能三个,一个gpio,一个usart,还有一个复用功能: 2.gpio的端口模式设定: 3.中断相应函数的名字是不能随便定义的,一般我们都遵循 MDK 定义的函数名.这些函数名字在启动文件 startup_stm32f10x_hd.s 文件中可以找到 4.串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO 时钟使能 2) 串口复位   一般在系统刚开始

GD32F450的串口DMA收发+接受完成中断

GD32的库比较糟糕当时完全是参考STM32的驱动来的,当然我也知道直接用ST的库可以,但是原因比较特殊就不多说了. 代码就不贴了,以后用GD的机会我想不会太多. 先初始化串口,使能串口,使能接受完成中断. 再初始化DMA通道.贴一段 1 int fputc(int ch, FILE *f) 2 { 3 usart_data_transmit(USART0, (uint8_t)ch); 4 while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)

【STM32】串口收发驱动Drv_Uart|学习笔记

一.什么事串口? 大家常说串口,其实串口有很多种UART,SPI,IIC都是串口,一般大家口中的串口就是UART(Universal Asynchronous Receiver/Transmitter),STM32上集成了UART的控制器,所以我们通过简单的配置就可以实现UART通信的功能.当然光有控制器可以在单板间通信,但大部分的应用场景都是需要远距离的抗干扰传输,这时就需要做电平转换,,目前工业上常用的串口屏,串口透传zigbee,诸如此类的设备都会用到标准的串行接口,所以单板上一般会加一个