#include “Main.h”
#include “stm32f10x_conf.h”
#include “DataType.h”
#include “NVIC.h”
#include “SysTick.h”
#include “RCC.h”
#include “Timer.h”
#include “UART1.h”
#include “LED.h”
#include “KeyOne.h”
#include “ProcKeyOne.h”
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h> /*********************************************************************************************************
宏定义
/
#define EXPRESSION_MAX_LEN 128 //长度
#define STACK_SISE 64 //栈的大小
/
内部变量
*********************************************************************************************************/
static char s_expr[EXPRESSION_MAX_LEN]={0 };//储存运算式
static float s_result=0.0f;//储存计算结果
static u8 s_has_expression=0;//是否有效运算式
static u8 s_calculated=0;//是否已计算
/*********************************************************************************************************
枚举结构体定义
/
//预算优先级
typedef enum {
PRIO_LOWEST=0,//最低
PRIO_ADD_SUB,//+,—
PRIO_MUL_DIV,///
PRIO_HIGHEST//()
}OpPriority;
/*
内部函数声明
/
static void InitSoftware(void); //初始化软件相关的模块
static void InitHardware(void); //初始化硬件相关的模块
static void Proc2msTask(void); //2ms处理任务
static void Proc1SecTask(void); //1s处理任务
static void clearExpression(void );//清空
static u8 AddToExpression(char c);//添加字符
static int GetPriority(char op);//获取优先级
static float Calculate(float a,float b,char op);//执行二元运算
static u8 EvaluateExpression(const charexpr,floatresult);//计算结果 /**
内部函数声明
/
static void InitSoftware(void); //初始化软件相关的模块
static void InitHardware(void); //初始化硬件相关的模块
static void Proc2msTask(void); //2ms处理任务
static void Proc1SecTask(void); //1s处理任务
static void clearExpression(void );//清空
static u8 AddToExpression(char c);//添加字符
static int GetPriority(char op);//获取优先级
static float Calculate(float a,float b,char op);//执行二元运算
static u8 EvaluateExpression(const charexpr,floatresult);//计算结果
/**
内部函数实现
/
/
函数名称:InitSoftware
函数功能:所有的软件相关的模块初始化函数都放在此函数中
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
/
static void InitSoftware(void)
{
clearExpression();//初始化清空表达式
}
/
函数名称:clearExpression
函数功能:清空
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
/
static void clearExpression(void )
{
memset (s_expr ,0,EXPRESSION_MAX_LEN );
s_has_expression =0;
s_calculated =0;
s_result =0.0f;
} /
函数名称:AddToExpression
函数功能:添加字符
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
static u8 AddToExpression(char c)
{
u16 len =strlen (s_expr );
if(len >=EXPRESSION_MAX_LEN -1)
{
return 0;
}
if ((c >= ‘0’ && c <= ‘9’) || c == ‘+’ || c == ‘-’ || c == ‘*’ || c == ‘/’ ||
c == ‘(’ || c == ‘)’ || c == ‘.’)
{
s_expr[len] = c;
s_has_expression = 1;
s_calculated = 0; // 新输入后需要重新计算
return 1;
}
return 0;
}
/*********************************************************************************************************
函数名称:GetPriority
函数功能:获取优先级
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
/
static int GetPriority(char op){
switch (op)
{
case’+':
case ‘_’:
return PRIO_ADD_SUB ;
case '':
case ‘/’:
return PRIO_MUL_DIV ;
case ‘(’:
case ‘)’:
return PRIO_HIGHEST ;
default :
return PRIO_LOWEST;
}
}
/*
函数名称:Calcuate
函数功能:二元计算
输入参数:a,b,op
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*******************************************************************************************************/
static float Calculate(float a,float b,char op)
{
switch (op)
{
case ‘+’:
return a+b;
case ‘-’:
return a-b;
case '':
return ab;
case ‘/’:
if(b==0) { printf ("error:除数不为0\n"); return 0.0f; }
// return (float )((int)(a/b));//取整
default :
return 0.0f;
}
} /*********************************************************************************************************
函数名称:EvaluateExpression
函数功能:计算结果
输入参数:expr result
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*******************************************************************************************************/
static u8 EvaluateExpression(const charexpr,floatresult)
{
float num_stack[STACK_SISE ];//数字栈
char op_stack[STACK_SISE];//运算符栈
int num_top=-1,op_top=-1;//栈顶
float num=0.0f;
float decimal_factor=0.1f;//小数因子 u8 negative=0;//是否为负 if(!expr ||!result ) return 1; while (*expr ) { if(*expr ==' ') { expr++; continue; } if((*expr >='0'&&*expr<='9')||*expr=='.') { if(*expr=='.') { if(decimal_factor){ return 1;} num+=(*expr-'0')*decimal_factor; decimal_factor*=0.1f; expr ++; } else { // 处理负号 if (*expr == '-' && (expr || *(expr-1) == '(' || *(expr-1) == '+' || *(expr-1) == '-' || *(expr-1) == '*' || *(expr-1) == '/')) { negative = 1; expr++; continue; } //入栈 if (num_top < STACK_SISE- 1) { num_stack[++num_top] = negative ? ((-1)*num) : num; num = 0.0f; decimal_factor = 0.1f; negative = 0; } else { return 1; // 栈溢出 } // 处理右括号 if (*expr == ')') { float a,b; char op; while (op_top >= 0 && op_stack[op_top] != '(') { if (num_top < 1) return 1; // 操作数不足 b = num_stack[num_top--]; a = num_stack[num_top--]; op = op_stack[op_top--]; num_stack[++num_top] = Calculate(a, b, op); } if (op_top < 0) return 1; // 括号不匹配 op_top--; // 弹出左括号 expr++; } // 处理其他运算符 else { float b ,a; char op; while (op_top >= 0 && op_stack[op_top] != '(' && GetPriority(op_stack[op_top]) >= GetPriority(*expr)) { if (num_top < 1) return 1; // 操作数不足 b = num_stack[num_top--]; a = num_stack[num_top--]; op = op_stack[op_top--]; num_stack[++num_top] = Calculate(a, b, op); } if (op_top < STACK_SISE- 1) op_stack[++op_top] = *expr; else return 1; // 栈溢出 expr++; } }
}
// 处理剩余的数字
if (num_top < STACK_SISE- 1)
{
num_stack[++num_top] = negative ? ((-1)*num) : num;
}
else
{
return 1; // 栈溢出
}
// 处理剩余的运算符
while (op_top >= 0)
{
float b,a;
char op;
if (op_stack[op_top] == ‘(’)
return 1; // 括号不匹配
if (num_top < 1) return 1; // 操作数不足 b = num_stack[num_top--]; a = num_stack[num_top--]; op = op_stack[op_top--]; num_stack[++num_top] = Calculate(a, b, op);
}
if (num_top != 0)
return 1; // 表达式错误
result = num_stack[0];
return 0;
}
return 0;
}
/********************************************************************************************************
函数名称:ProcKeyDownKey1
函数功能:
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
/
void ProcKeyDownKey1(void)
{
if (s_has_expression)
{
u8 ret = EvaluateExpression(s_expr, &s_result);
if (ret == 0)
{
s_calculated = 1;
printf(“\r\n计算完成,结果为: %.2f\r\n”, s_result);
printf(“按KEY2发送结果,按KEY3清空\r\n”);
}
else
{
printf(“\r\n表达式错误,请重新输入\r\n”);
s_calculated = 0;
}
}
else
{
printf(“\r\n请先输入运算式\r\n”);
}
}
/
函数名称:ProcKeyUpKey1
函数功能:处理按键弹起的事件,即按键弹起的响应函数
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void ProcKeyUpKey1(void)
{
}
/*********************************************************************************************************
函数名称:ProcKeyDownKey2
函数功能:处理按键按下的事件,即按键按下的响应函数
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
/
void ProcKeyDownKey2(void)
{
if (s_calculated && s_has_expression)
{
char result_str[32];
sprintf(result_str, “\r\n计算结果: %.2f\r\n”, s_result);
WriteUART1((u8)result_str, strlen(result_str));
}
else if (s_has_expression)
{
printf(“\r\n请先按KEY1计算结果\r\n”);
}
else
{
printf(“\r\n请输入运算式\r\n”);
}
}/*
函数名称:ProcKeyUpKey2
函数功能:处理按键弹起的事件,即按键弹起的响应函数
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void ProcKeyUpKey2(void)
{
}
/*********************************************************************************************************
函数名称:ProcKeyDownKey1
函数功能:处理按键按下的事件,即按键按下的响应函数
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
/
void ProcKeyDownKey3(void)
{
clearExpression();
printf(“\r\n已清空运算式,请重新输入\r\n”);
}
/
函数名称:ProcKeyUpKey3
函数功能:处理按键弹起的事件,即按键弹起的响应函数
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void ProcKeyUpKey3(void)
{
}/*********************************************************************************************************
函数名称:main
函数功能:主函数
输入参数:void
输出参数:void
返 回 值:int
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
int main(void)
{
InitSoftware(); //初始化软件相关函数
InitHardware(); //初始化硬件相关函数
printf(“Init System has been finished.\r\n” ); //打印系统状态
while(1)
{
Proc2msTask(); //2ms处理任务
Proc1SecTask(); //1s处理任务
}//在keyone.c中
/*********************************************************************************************************
包含头文件
*********************************************************************************************************/
#include “KeyOne.h”
#include “stm32f10x_conf.h”
#include “Timer.h”
/*********************************************************************************************************
宏定义
/
/
枚举结构体定义
*********************************************************************************************************/
/*********************************************************************************************************
内部变量
/
//按键按下时的电压,0xFF表示按下为高电平,0x00表示按下为低电平
static u8 s_arrKeyDownLevel[KEY_NAME_MAX]; //使用前要在InitKeyOne函数中进行初始化
/
内部函数声明
*********************************************************************************************************/
static void ConfigKeyOneGPIO(void);//配置按键的GPIO
static void ConfigKeyOneGPIO(void )
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO_InitStructure用于存放GPIO的参数
//使用RCC相关时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );//使能GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );//使能GPIOC的时钟
//配置PC1
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1 ; //设置引脚
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输入类型
GPIO_Init(GPIOC,&GPIO_InitStructure); //根据参数初始化GPIO
//配置PC2
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2 ; //设置引脚
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输入类型
GPIO_Init(GPIOC,&GPIO_InitStructure); //根据参数初始化GPIO
//配置PA0
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 ; //设置引脚
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输入类型
GPIO_Init(GPIOA,&GPIO_InitStructure); //根据参数初始化GPIO
}
/*********************************************************************************************************
API函数实现
/
/
函数名称:
函数功能:
输入参数:
输出参数:
返 回 值:
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void InitKeyOne(void )
{ConfigKeyOneGPIO (); //配置按键的GPIO
s_arrKeyDownLevel[KEY_NAME_KEY1]=KEY_DOWN_LEVEL_KEY1; //按键KEY1按下时为低电平
s_arrKeyDownLevel[KEY_NAME_KEY2]=KEY_DOWN_LEVEL_KEY2; //按键KEY2按下时为低电平
s_arrKeyDownLevel[KEY_NAME_KEY3]=KEY_DOWN_LEVEL_KEY3; //按键KEY3按下时为低电平
}
/*********************************************************************************************************
函数名称:ScanKeyOne
函数功能:按键扫描,每10ms调用一次
输入参数:keyName-按键名,OnKeyOneUp-按键弹起响应函数指针,OnKeyOneDown-按键按下响应函数的指针
输出参数:viod
返 回 值:viod
创建日期:2018年01月01日 void ScanKeyOne(u8 keyName,void(*OnKeyOneUp)(void),void(*OnKeyOneDown)(void))
{
static u8 s_arrKeyVal[KEY_NAME_MAX]; //定义一个u8类型的数组,用于存放按键的数值
static u8 s_arrKeyFlag[KEY_NAME_MAX]; //定义一个u8类型的数组,用于存放按键的标志位
s_arrKeyVal[keyName]=s_arrKeyVal[keyName] << 1; //左移一位
switch(keyName)
{
case KEY_NAME_KEY1:
s_arrKeyVal[keyName]=s_arrKeyVal[keyName]|KEY1;//按下/弹起时,KEY1为0/1
break;
case KEY_NAME_KEY2:
s_arrKeyVal[keyName]=s_arrKeyVal[keyName]|KEY2;//按下/弹起时,KEY2为0/1
break;
case KEY_NAME_KEY3:
s_arrKeyVal[keyName]=s_arrKeyVal[keyName]|KEY3;//按下/弹起时,KEY3为0/1
break;
default:
break;
}
//按下标志位的值为TRUE时,判断是否有按键有效按下
if(s_arrKeyVal[keyName]==s_arrKeyDownLevel[keyName]&& s_arrKeyFlag[keyName]==TRUE)
{
(*OnKeyOneDown)(); //执行按键按下的响应函数
s_arrKeyFlag[keyName]=FALSE; //表示按键处于按下状态,按键标志位的值更改为FALSE
}
//按键标志位的值为FALSE时,判断是否有按键有效弹起
else if(s_arrKeyVal[keyName]==(u8)(~s_arrKeyDownLevel[keyName])&&s_arrKeyFlag[keyName]==FALSE)
{
(OnKeyOneUp)(); //执行按键弹起的响应函数
s_arrKeyFlag[keyName]=TRUE; //表示按键处于按下状态,按键标志位的值更改为TRUE
}
} /********************************************************************************************************
包含头文件
*********************************************************************************************************/
#include “UART1.h”
#include “stm32f10x_conf.h”
#include “Queue.h”
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
/*********************************************************************************************************
枚举结构体定义
*********************************************************************************************************/
//串口发送状态
typedef enum
{
UART_STATE_OFF, //串口未发送数据
UART_STATE_ON, //串口正在发送数据
UART_STATE_MAX
}EnumUARTState;
/*********************************************************************************************************
内部变量
*********************************************************************************************************/
static StructCirQue s_structUARTSendCirQue; //发送串口循环队列
static StructCirQue s_structUARTRecCirQue; //接收串口循环队列
static u8 s_arrSendBuf[UART1_BUF_SIZE]; //发送串口循环队列的缓冲区
static u8 s_arrRecBuf[UART1_BUF_SIZE]; //接收串口循环队列的缓冲区
static u8 s_iUARTTxSts; //串口发送数据状态
/*********************************************************************************************************
内部函数声明
*********************************************************************************************************/
static void InitUARTBuf(void); //初始化串口缓冲区,包括发送缓冲区和接收缓冲区
static u8 WriteReceiveBuf(u8 d); //将接收到的数据写入接收缓冲区
static u8 ReadSendBuf(u8 *p); //读取发送缓冲区中的数据
static void ConfigUART(u32 bound); //配置串口相关的参数,包括GPIO、RCC、USART和NVIC
static void EnableUARTTx(void); //使能串口发送,WriteUARTx中调用,每次发送数据之后需要调用
static void SendCharUsedByFputc(u16 ch); //发送字符函数,专由fputc函数调用
/*********************************************************************************************************
内部函数实现
/
/
函数名称:InitUARTBuf
函数功能:初始化串口缓冲区,包括发送缓冲区和接收缓冲区
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
static void InitUARTBuf(void)
{
i16 i;
for(i = 0; i < UART1_BUF_SIZE; i++)
{
s_arrSendBuf[i] = 0;
s_arrRecBuf[i] = 0;
}
InitQueue(&s_structUARTSendCirQue, s_arrSendBuf, UART1_BUF_SIZE);
InitQueue(&s_structUARTRecCirQue, s_arrRecBuf, UART1_BUF_SIZE);
} /*********************************************************************************************************
函数名称:WriteReceiveBuf
函数功能:写数据到串口接收缓冲区
输入参数:d,待写入串口接收缓冲区的数据
输出参数:void
返 回 值:写入数据成功标志,0-不成功,1-成功
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
static u8 WriteReceiveBuf(u8 d)
{
u8 ok = 0; //写入数据成功标志,0-不成功,1-成功
ok = EnQueue(&s_structUARTRecCirQue, &d, 1);
return ok; //返回写入数据成功标志,0-不成功,1-成功
}
/*********************************************************************************************************
函数名称:ReadSendBuf
函数功能:读取串口发送缓冲区中的数据
输入参数:p,读出来的数据存放的首地址
输出参数:p,读出来的数据存放的首地址
返 回 值:读取数据成功标志,0-不成功,1-成功
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
static u8 ReadSendBuf(u8 *p)
{
u8 ok = 0; //读取数据成功标志,0-不成功,1-成功
ok = DeQueue(&s_structUARTSendCirQue, p, 1);
return ok; //返回读取数据成功标志,0-不成功,1-成功
} /*********************************************************************************************************
函数名称:ConfigUART
函数功能:配置串口相关的参数,包括GPIO、RCC、USART和NVIC
输入参数:bound,波特率
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
static void ConfigUART(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO_InitStructure用于存放GPIO的参数
USART_InitTypeDef USART_InitStructure; //USART_InitStructure用于存放USART的参数
NVIC_InitTypeDef NVIC_InitStructure; //NVIC_InitStructure用于存放NVIC的参数
//使能RCC相关时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA的时钟
//配置TX的GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //设置TX的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置TX的模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置TX的I/O口输出速度
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化TX的GPIO
//配置RX的GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //设置RX的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置RX的模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化RX的GPIO
//配置USART的参数
USART_StructInit(&USART_InitStructure); //初始化USART_InitStructure
USART_InitStructure.USART_BaudRate = bound; //设置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据字长度
USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置模式
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置硬件流控制模式
USART_Init(USART1, &USART_InitStructure); //根据参数初始化//使能USART1及其中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收缓冲区非空中断
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲区空中断
USART_Cmd(USART1, ENABLE); //使能USART1
s_iUARTTxSts = UART_STATE_OFF; //串口发送数据状态设置为未发送数据
} /*********************************************************************************************************
函数名称:EnableUARTTx
函数功能:使能串口发送,在WriteUARTx中调用,即每次发送数据之后需要调用这个函数来使能发送中断
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:s_iUARTTxSts = UART_STATE_ON;这句话必须放在USART_ITConfig之前,否则会导致中断打开无法执行
*********************************************************************************************************/
static void EnableUARTTx(void)
{
s_iUARTTxSts = UART_STATE_ON; //串口发送数据状态设置为正在发送数据
USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送中断
}
/*********************************************************************************************************
函数名称:SendCharUsedByFputc
函数功能:发送字符函数,专由fputc函数调用
输入参数:ch,待发送的字符
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
static void SendCharUsedByFputc(u16 ch)
{
USART_SendData(USART1, (u8)ch);
//等待发送完毕
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
} /*********************************************************************************************************
函数名称:USART1_IRQHandler
函数功能:USART1中断服务函数
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void USART1_IRQHandler(void)
{
u8 uData = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收缓冲区非空中断
{
NVIC_ClearPendingIRQ(USART1_IRQn); //清除USART1中断挂起
uData = USART_ReceiveData(USART1); //将USART1接收到的数据保存到uData
WriteReceiveBuf(uData); //将接收到的数据写入接收缓冲区
}
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET) //溢出错误标志为1
{
USART_ClearFlag(USART1, USART_FLAG_ORE); //清除溢出错误标志
USART_ReceiveData(USART1); //读取USART_DR
}
if(USART_GetITStatus(USART1, USART_IT_TXE)!= RESET) //发送缓冲区空中断
{
USART_ClearITPendingBit(USART1, USART_IT_TXE); //清除发送中断标志
NVIC_ClearPendingIRQ(USART1_IRQn); //清除USART1中断挂起
ReadSendBuf(&uData); //读取发送缓冲区的数据到uData
USART_SendData(USART1, uData); //将uData写入USART_DR
if(QueueEmpty(&s_structUARTSendCirQue)) //当发送缓冲区为空时
{ /*********************************************************************************************************
API函数实现
/
/
函数名称:InitUART1
函数功能:初始化UART模块
输入参数:bound,波特率
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void InitUART1(u32 bound)
{
InitUARTBuf(); //初始化串口缓冲区,包括发送缓冲区和接收缓冲区
ConfigUART(bound); //配置串口相关的参数,包括GPIO、RCC、USART和NVIC
}
/*********************************************************************************************************
函数名称:WriteUART1
函数功能:写串口,即写数据到的串口发送缓冲区
输入参数:pBuf,要写入数据的首地址,len,期望写入数据的个数
输出参数:void
返 回 值:成功写入数据的个数,不一定与形参len相等
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
u8 WriteUART1(u8 *pBuf, u8 len)
{
u8 wLen = 0; //实际写入数据的个数
wLen = EnQueue(&s_structUARTSendCirQue, pBuf, len);
if(wLen < UART1_BUF_SIZE)
{
if(s_iUARTTxSts == UART_STATE_OFF)
{
EnableUARTTx();
}
}
return wLen; //返回实际写入数据的个数
} /*********************************************************************************************************
函数名称:ReadUART1
函数功能:读串口,即读取串口接收缓冲区中的数据
输入参数:pBuf,读取的数据存放的首地址,len,期望读取数据的个数
输出参数:pBuf,读取的数据存放的首地址
返 回 值:成功读取数据的个数,不一定与形参len相等
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
u8 ReadUART1(u8 *pBuf, u8 len)
{
u8 rLen = 0; //实际读取数据长度
rLen = DeQueue(&s_structUARTRecCirQue, pBuf, len);
return rLen; //返回实际读取数据的长度
}
/*********************************************************************************************************
函数名称:fputc
函数功能:重定向函数
输入参数:ch,f
输出参数:void
返 回 值:int
创建日期:2018年01月01日
注 意:
********************************************************************************************************/
int fputc(int ch, FILE f)
{
SendCharUsedByFputc((u8) ch); //发送字符函数,专由fputc函数调用
return ch; //返回ch
} /*********************************************************************************************************
包含头文件
/
#include “ProcKeyOne.h”
#include “UART1.h” /
函数名称:InitProcKeyOne
函数功能:初始化ProcKryOne模块
输入参数:void
输出参数:void
返 回 值:void
创建日期:2018年01月01日
注 意:
*********************************************************************************************************/
void InitProcKeyOne(void)
{
}以此代码为主题,定义名称不变完成简易计算机的设计
最新发布