一、前期准备
单片机:STM32F103ZET6
开发环境:MDK5.14
库函数:标准库V3.5
FreeRTOS:V9.0.0(网上下载,官网上目前是V10.0.1)
二、实验效果
总共6个任务,串口1、串口2、4个RGB小灯以不同频率闪烁。5050 RGB LED驱动请参考RGB驱动,串口1、2同时打印测试信息。
三、移植准备
下载好的FreeRTOS源码中,只需要把Source文件夹加入工程。
1.FreeRTOS内核文件,如下图所示,里面所有C文件加入到工程里面
2.将portable中无关文件夹删除掉,只留下如图所示的三个文件夹。Keil文件夹不用管,MemMang里面是heap1.c~heap5.c文件,这个是内存管源码,这里移植将heap4.c加入工程。RVDS中ARM_M3的C文件加入工程
3.Keil工程
4.修改stm32启动文件
四、测试代码
完整工程请加QQ:1002521871,验证:呵呵
uart.h
#ifndef __UART_H__
#define __UART_H__
#include "stm32f10x.h"
#include
#include
#include
#include "message.h"
/* UART IOpin definirion */
#define TX1 GPIO_Pin_9
#define RX1 GPIO_Pin_10
#define TX2 GPIO_Pin_2
#define RX2 GPIO_Pin_3
#define TX3 GPIO_Pin_10
#define RX3 GPIO_Pin_11
#define RecDataLen 128
extern char RecData[RecDataLen];
extern char *pIndex;
extern char *pWrite;
extern char *pRead;
extern int USART_PRINTF_FLAG;
extern void USARTConfiguration(int Baudrate);
extern void USART_Send(USART_TypeDef* USARTx, char c);
extern char USART_Received(USART_TypeDef* USARTx);
#endif
uart.c,多串口通用printf程序请参考多串口共用printf讲解
#include "uart.h"
char RecData[RecDataLen] = {0};
char *pIndex = RecData;
char *pWrite = RecData;
char *pRead = RecData;
int USART_PRINTF_FLAG = 0;
void USARTConfiguration(int Baudrate)
{
USART_InitTypeDef MyUSART;
GPIO_InitTypeDef GPIO;
NVIC_InitTypeDef MyNVIC;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 |
RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO.GPIO_Pin = TX1;
GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO.GPIO_Pin = RX1;
GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
MyNVIC.NVIC_IRQChannel = USART1_IRQn;
MyNVIC.NVIC_IRQChannelSubPriority = 0;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 0;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
MyUSART.USART_BaudRate = Baudrate;
MyUSART.USART_WordLength = USART_WordLength_8b;
MyUSART.USART_StopBits = USART_StopBits_1;
MyUSART.USART_Parity = USART_Parity_No;
MyUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
MyUSART.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &MyUSART);
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
/* Configure USART2 Tx (PA.02) as alternate function push-pull */
GPIO.GPIO_Pin = TX2;
GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO);
/* Configure USART2 Rx (PA.3) as input floating */
GPIO.GPIO_Pin = RX2;
GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
MyNVIC.NVIC_IRQChannel = USART2_IRQn;
MyNVIC.NVIC_IRQChannelSubPriority = 0;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 1;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
MyUSART.USART_BaudRate = Baudrate;
MyUSART.USART_WordLength = USART_WordLength_8b;
MyUSART.USART_StopBits = USART_StopBits_1;
MyUSART.USART_Parity = USART_Parity_No;
MyUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
MyUSART.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART2, &MyUSART);
USART_Cmd(USART2, ENABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
/* Configure USART3 Tx (PB.10) as alternate function push-pull */
GPIO.GPIO_Pin = TX3;
GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO);
/* Configure USART3 Rx (PB.11) as input floating */
GPIO.GPIO_Pin = RX3;
GPIO.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
MyNVIC.NVIC_IRQChannel = USART3_IRQn;
MyNVIC.NVIC_IRQChannelSubPriority = 0;
MyNVIC.NVIC_IRQChannelPreemptionPriority = 2;
MyNVIC.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&MyNVIC);
MyUSART.USART_BaudRate = Baudrate;
MyUSART.USART_WordLength = USART_WordLength_8b;
MyUSART.USART_StopBits = USART_StopBits_1;
MyUSART.USART_Parity = USART_Parity_No;
MyUSART.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
MyUSART.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART3, &MyUSART);
USART_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
}
void USART_Send(USART_TypeDef* USARTx, char c)
{
USART_SendData(USARTx, c);
/* loop until the end of transmission */
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
char USART_Received(USART_TypeDef* USARTx)
{
char dat;
//while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
dat = (char)(USART_ReceiveData(USARTx)&0xff);
return dat;
}
void USART1_IRQHandler(void)
{
uint8_t clear = clear;
USART_PRINTF_FLAG = 1;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE) != RESET )
{
if ( (*(pWrite-1) != 0x0A) && ((pWrite - pIndex) < RecDataLen) )
{
*pWrite = USART_Received(USART1);
pWrite ++;
}
else
{
USART_Received(USART1);
}
}
else if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
if ( *(pWrite - 1) == 0x0A && *(pWrite - 2) == 0x0D)
{
cmdDealFlag = 1;
}
else
{
printf("%s", RecFlowMess);
}
pWrite = pIndex;
clear = USART1->SR;
clear = USART1->DR;
}
}
void USART2_IRQHandler(void)
{
uint8_t clear = clear;
USART_PRINTF_FLAG = 2;
if(USART_GetFlagStatus(USART2,USART_IT_RXNE) != RESET )
{
if ( (*(pWrite-1) != 0x0A) && ((pWrite - pIndex) < RecDataLen) )
{
*pWrite = USART_Received(USART2);
pWrite ++;
}
else
{
USART_Received(USART2);
}
}
else if (USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
{
if ( *(pWrite - 1) == 0x0A && *(pWrite - 2) == 0x0D)
{
cmdDealFlag = 1;
}
else
{
printf("%s", RecFlowMess);
}
pWrite = pIndex;
clear = USART2->SR;
clear = USART2->DR;
}
}
void USART3_IRQHandler(void)
{
uint8_t clear = clear;
USART_PRINTF_FLAG = 3;
if(USART_GetFlagStatus(USART3,USART_IT_RXNE) != RESET )
{
if
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』