Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423108
  • 博文数量: 55
  • 博客积分: 167
  • 博客等级: 入伍新兵
  • 技术积分: 1167
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-28 10:20
个人简介

一个算是正常的中国码农!

文章分类

全部博文(55)

文章存档

2014年(1)

2013年(31)

2012年(23)

我的朋友

分类: C/C++

2013-06-27 18:13:05

这几天在调试stm32f407的discover板子潜入ucos III 开始遇到很到的困难,一看函数到挺多的,感觉很简单,但是对于刚接触的童靴们估计有点困难,理解不好
分为以下几步:
1、初始化你要使用的i/o外设,这是应用st提供的官方库函数进行初始化:
2、利用ucos中bsp_int.C文件中定义的文件进行初始化处理,这样进行初始化;(后面会附上代码)
3、找准代码的运行顺序和意义;
4、测试好你的串口是可用的;
代码如下:
#include "USART.h"


void USART1_Configuration(void)  //端口初始化
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure; 
  RCC_AHB1PeriphClockCmd(Open_USART_TX_GPIO_CLK,ENABLE);
  RCC_AHB1PeriphClockCmd(Open_USART_RX_GPIO_CLK,ENABLE);
  RCC_APB2PeriphClockCmd(Open_USART_CLK,ENABLE);
  GPIO_PinAFConfig(Open_USART_TX_GPIO_PORT, Open_USART_TX_SOURCE, Open_USART_TX_AF);
  GPIO_PinAFConfig(Open_USART_RX_GPIO_PORT, Open_USART_RX_SOURCE, Open_USART_RX_AF);
  /*
  *  Open_USART_TX -> PA9 , Open_USART_RX -PA10
  */
  GPIO_InitStructure.GPIO_Pin = Open_USART_TX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(Open_USART_TX_GPIO_PORT, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = Open_USART_RX_PIN;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(Open_USART_RX_GPIO_PORT, &GPIO_InitStructure);
/*
    USARTx configured as follow:
         - BaudRate = 115200 baud  
- Word Length = 8 Bits
         - One Stop Bit
         - No parity
         - Hardware flow control disabled (RTS and CTS signals)
         - Receive and transmit    
 */


  USART_InitStructure.USART_BaudRate = 115200; 
  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_Init(USART1, &USART_InitStructure);
  /* Enable the Open_USART Transmit interrupt: this interrupt is generated when the 
     Open_USART transmit data register is empty */
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //usart1??????????
  USART_Cmd(USART1, ENABLE);
}
void USART1_NVIC_Config(void)
{                                                                   //中断初始化
  NVIC_InitTypeDef NVIC_InitStructure;


  /* Enable the USARTx Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = Open_USART_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void USART1_INIT(void)                             //中断全部初始化
{
USART1_Configuration();
  USART1_NVIC_Config();
  BSP_IntVectSet(BSP_INT_ID_USART1, usart1_test);  //??×????¨????????  BSP_IntHandlerUSART1
  BSP_IntPrioSet(BSP_INT_ID_USART1,1);    
  BSP_IntEn(BSP_INT_ID_USART1);                             //????????
}

初始化的步骤:
BSP_IntVectSet开始说:他是* Description : Assign ISR handler.我理解就是通过bsp中的id将你的这个中断跟你的处理函数联系起来;(处理函数usart1_test)是你自己写的处理函数,里面一般就会清中断,想任务发送信号或者是消息。(一定要注意清中断,并且在中断中不要进行太多的运算,运算一般在任务里完成)。
BSP_IntPrioSet(BSP_INT_ID_USART1,1);   这个是将你的usart优先级进行设置。一般通讯的优先级比较高。
BSP_IntEn(BSP_INT_ID_USART1);  开中断;
还有个地方需要说明void  BSP_IntHandlerUSART1 (void) 
{
  BSP_IntHandler(BSP_INT_ID_USART1);   //???????????í?????¨?©
}

这里面你不要动,因为他包含了中央处理函数,系统会在中端到来的时候跳到这里。
 BSP_IntHandler(BSP_INT_ID_USART1); //中央处理函数,他里面的isr()就是志向usart1_test的指针。
你自己使用就可以完成相应的调试。





阅读(9722) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~