这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » 【白骨精】hanshuyujifen2的进程帖 8.20更新 示例工程中串口初始

共44条 3/5 1 2 3 4 5 跳转至
院士
2013-06-16 21:31:31     打赏
21楼
干吗攒在一起发?

高工
2013-06-16 21:35:04     打赏
22楼
没攒,每天都在发啊。

高工
2013-06-20 17:16:46     打赏
23楼
继续更新啊,帖子不错

高工
2013-06-20 19:03:35     打赏
24楼

谢谢。

这几天比较忙。过几天就好了


高工
2013-06-26 20:58:56     打赏
25楼
顶起来好找。。。。。。。。

专家
2013-06-26 21:21:08     打赏
26楼
军爷,跑的挺快啊,做这么多实验了啊。仰视一下。

助工
2013-06-28 11:13:50     打赏
27楼
牛!!!!!!!!!!!

高工
2013-07-01 22:55:21     打赏
28楼

实验13:中断处理

中断处理是一个比较有意思的东西。uTenux的中断处理包括了处理外部中断、CPU异常等。他是OS中任务无关部分。因此,当中断到来的时候OS会停止任务调度,不会发生任务切换。直到程序从中断中返回。

uTenux的中断处理部分API如下:

1、定义中断处理程序

         ER ercd= tk_def_int(UINT dintno,T_DINT* pk_dint);

这个函数定义一个中断定义编号为dtintno的中断处理程序,并允许中断处理程序运行。

中断定义编号是0-255的,比如Cortex-M3NMI就是2UASRT1中断就是44USART2中断就是45USART3中断就是46.这些可以查STDatasheet得到。uTenux中,没有强制将中断处理程序定义成指定的函数,用户可以手动添加。对于外设来说,ST的宏定义是0-240的,使用tk_def_int时需要加上16

pk_dint是中断处理程序的定义,其定义结构体如下:

typedef struct t_dint {

         ATR                 intatr;                       /* 处理程序属性 */

         FP                  inthdr;                       /* 中断处理函数入口地址 */

} T_DINT;

2、从中断处理程序中返回

                   void  tk_ret_int();

当处理程序正在运行时,由中断处理程序所调用的系统调用并不会产生分派;相反,分派将会被延迟到调用tk_ret_int来终止中断处理程序的处理以后(分派延迟)。因此,tk_ret_int会导致对所有在中断处理程序运行期间所发布的分派请求进行处理。

 

【实验描述】

本次实验在市里工程的基础上完成。打开了串口3的接收中断,并使用OS的功能来完成中断的接收和处理。

1、我重写了usart3的初始化函数,使用了我熟悉的库函数操作。

2、设置NVIC,初始化串口3的中断

3、使用tk_def_int定义中断处理函数。

4、在中断处理函数中通过串口向主机消息,表明已经进入了中断。

【实验代码和输出】

1、串口3初始化代码:

void uart3_init(void)

{

  USART_InitTypeDef USART_InitStructure;

  GPIO_InitTypeDef GPIO_InitStructure;

 

  RCC_APB1PeriphClockCmd(RCC_APB1ENR_USART3EN,ENABLE);

 

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);

 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOC,&GPIO_InitStructure);

 

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_USART3);

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_USART3);

 

  USART_InitStructure.USART_BaudRate = 115200;

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_Init(USART3,&USART_InitStructure);

 

  USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);

 

  USART_Cmd(USART3,ENABLE);

         return;

}

2NVIC设置代码:

void NVIC_Config(void)

{

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置中断优先级分组

  //使能USART3中断

  NVIC_IniteStructure.NVIC_IRQChannel = USART3_IRQn;

  NVIC_IniteStructure.NVIC_IRQChannelPreemptionPriority = 0x01;

  NVIC_IniteStructure.NVIC_IRQChannelSubPriority = 0x02;

  NVIC_IniteStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_IniteStructure);

 

}

3、中断处理代码

 

 

#include "IntSample.h"

 

void Usart3Handler(UINT dintno);

 

EXPORT ER IntSample( void )

{

    UINT i;

    ER ercd;

    UINT intsts;

    T_DINT dint;

#if (USE_DBGSPT && USE_HOOK_TRACE)

    TD_HINT hint;

#endif

 

    DI(intsts);//屏蔽所有中断

    dint.intatr=TA_HLNG;

    dint.inthdr=Usart3Handler;//IntHandler;

    ercd=tk_def_int((UINT)DINTNO(USART3_IRQn),&dint);  //注册串口3中断

    EI(intsts);//使能所有中断

    while(1);

}

 

void Usart3Handler(UINT dintno)

{

  B c;

  USART_ClearFlag(USART3,USART_FLAG_RXNE);//清除中断标志

  tm_putstring((UB*)"this is in usart 3 handler.\n");

  tk_ret_int();

}

 

【输出】

需要使用串口软件向MCU发送数据才能显示

 

----------------------------------------------------

        micro Tenux Version 1.6.00(build 0180)     

            Supported MCU is ST STM32F407VG        

  Copyright(c) 2008-2013 by Dalian uLoong Co.,Ltd. 

----------------------------------------------------

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

this is in usart 3 handler.

【疑问】

中断时候的寄存器保存是在那里进行的?我的M4板子,如果开启了FPU功能,还需要手动添加寄存器保存处理。这个怎样自己添加?


院士
2013-07-10 10:58:39     打赏
29楼
如果开启了STM32F407的FPU功能,其保存寄存器是一定要做重新移植的。多出来的fpu寄存器也是必须保存的。

高工
2013-07-10 22:04:03     打赏
30楼
这个帖子好详细,好强大~!这样的学习和奉献精神值得学习

共44条 3/5 1 2 3 4 5 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]