原创 STM32最小系统也跑FreeRTOS----IAR (原创)---接上篇

2008-8-18 21:18 11407 9 19 分类: MCU/ 嵌入式

下载了FreeRTOS-v5.02后,解压, 由于手头没有STM32的开发板,一直在用当时ST做活动时送的那个最小系统,看过我博客的朋友应该见过一个图,只引出了串口与USB口.


这里我们要关注的目录有:


点击看大图


这里主要讲的是要把freertos在最小系统上跑起来,主要需处理的是串口驱动相关部分,


根据我在串口控制台的方法,把最小系统上的串口驱动起来,这里有些不同,这里发送接收都采用中断方式,驱动设置如下:


/* Configure USARTx_Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOx, &GPIO_InitStructure);
       
/* Configure USARTx_Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOx, &GPIO_InitStructure);
       
USART_InitStructure.USART_BaudRate = ulWantedBaud;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl =                                                     USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Clock = USART_Clock_Disable;
USART_InitStructure.USART_CPOL = USART_CPOL_Low;
USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
  
USART_Init( USARTx, &USART_InitStructure );  
USART_ITConfig( USARTx, USART_IT_RXNE, ENABLE );
USART_Cmd( USARTx, ENABLE );
 
  
NVIC_InitStructure.NVIC_IRQChannel = USARTx_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);  


中断处理如下: 串口发达接收都增加一个环形缓冲队列,参照serial.c更改即可.
if( USART_GetITStatus( USARTx, USART_IT_TXE ) == SET )
{
    if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xHigherPriorityTaskWoken )
                    == pdTRUE )
         USART_SendData( USARTx, cChar );
    else
         USART_ITConfig( USARTx, USART_IT_TXE, DISABLE );  
}
if( USART_GetITStatus( USARTx, USART_IT_RXNE ) == SET )
{
    cChar = USART_ReceiveData( USARTx );
    xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken );

portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );


然后利用FreeRTOS提供的互斥信号量封装串口发送函数,如下:


// taskENTER_CRITICAL(); // 20080808
    if(uartMutexHandle!=NULL)
    {
//xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime );
//xQueueGiveMutexRecursive( xQueueHandle xMutex );
        if(xQueueTakeMutexRecursive(uartMutexHandle,(portTickType)10)==pdTRUE)
        {
         pxNext = ( signed portCHAR * ) pcString;
         while( *pxNext )
         {
          xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
          pxNext++;
         }
         xQueueGiveMutexRecursive(uartMutexHandle);
        }
    }
// taskEXIT_CRITICAL();


初始化时创建互斥信号量: uartMutexHandle = xSemaphoreCreateMutex(); // 20080815


 

文章评论10条评论)

登录后参与讨论

用户499533 2010-9-26 08:56

你好 可不可以写下从空白项目开始,把freertos移植到stm32的步骤, 像添加什么系统文件和修改相应的参数,可以实现简单的流水灯例子的那种

walnutcy_696810119 2009-10-26 21:17

建议直接用官网那一版改下,我手上资料现在不好找,换了个硬盘,呵呵。

用户1190910 2009-10-24 11:06

哥们能不能发份代码给我学习下!本人的最小系统也吃灰好久了。。。。。 lichcct@163.com

用户1397074 2009-2-20 10:51

我刚刚初学FREERTOS,有很多方面还没有哦入门,以前了解的是uc/os 2,能不能将工程代码发给我呢?wuqingmao33@126.com

walnutcy_696810119 2009-1-5 19:08

你的编译报错应该是配制的问题, #define configUSE_MUTEXES 1 还有一点,我原文中就没有给出定义:xSemaphoreHandle uartMutexHandle;

用户1001363 2009-1-4 22:09

还是我 我就是像你这样创建 但是 uartMutexHandle 识别不了编译报错 我使用Mutex 代替则可以 但是达不到互斥的作用 很想攻破这里 目前的情况 对队列 信号量 和消息 有点迷糊 所以能否把你的这个工程打包给我试试 我也有这个最小系统 应该是一个任务创建 然后销毁吧 我怎么感觉跟UCOS的使用有点不一样 。。。。 请帮助 邮箱如上

walnutcy_696810119 2009-1-4 19:42

使用信号量直接创建后就可以了啊,: uartMutexHandle = xSemaphoreCreateMutex(); 是不是你的OS配置有问题??

用户1001363 2009-1-4 14:22

我在用FREERTOS的时候使用互斥信号量总不成功 不知可否把本工程发个我研究一下 谢谢 e_liucheng@126.com

用户1001363 2009-1-4 14:22

我在用FREERTOS的时候使用互斥信号量总不成功 不知可否把本工程发个我研究一下 谢谢 e_liucheng@126.com

用户1001363 2009-1-4 14:21

我在用FREERTOS的时候使用互斥信号量总不成功 不知可否把本工程发个我研究一下 谢谢 e_liucheng@126.com
相关推荐阅读
walnutcy_696810119 2012-11-21 08:37
Linux下使用smartCOM调试串口
在Windows下的串口调试一直使用sscom,在Linux下只找到一个cutecom,用了几次,很不喜欢,就着手开发了一款自己的串口调试工具,smartCOM。 smartCOM介绍:http...
walnutcy_696810119 2012-03-29 18:12
【博客大赛】原创--测量基础:什么是测量
写在正文之前: 适逢EDNChina搞活动,而我本人也算在测量业工作,就一起作下笔记吧。若有错误,请大家一起斧正。笔者写本文一方面是梳理知识,另一方面也希望与大家探讨有关测量的知识、应用等,希...
walnutcy_696810119 2011-12-20 18:29
GLONASS 15年来,首次实现24颗星在轨可用
  EDN的博客改版后,不太好用,在SINA重开一个,不过重点改为关注GNSS行业新闻 http://blog.sina.com.cn/s/blog_7420cd1701012en9....
walnutcy_696810119 2011-12-20 17:49
逆向工程第一步:通信协议分析
工程中常有这样的事,想分析下其他知名公司产品中的通信协议,以便生产设计兼容产品。 1) 逆向工程,首先要了解产品,知己知彼,百战不怠;     去年受命想仿一款GARMIN的导航盒,但无法...
walnutcy_696810119 2011-11-14 11:30
通用代码调试方法 (Keil, VCC)
调试代码一般需要定位问题,这里给出一个解决方案, 一般的编译器均支持这些宏指令。   #define DEBUG_WALT_1113     1 extern void log_t...
我要评论
10
9
关闭 站长推荐上一条 /2 下一条