新手上路
- 积分
- 36
- 金钱
- 36
- 注册时间
- 2014-5-16
- 在线时间
- 0 小时
|
5金钱
最近写了一个程序,利用STM32F103ZET6的PB10管脚,采用上升沿触发中断来统计1分钟内输入方波个数,调试结果很理想。同样的程序,烧写进STM32F103RBT6,也是PB10管脚,但是结果差异很大。输出结果很不稳定,且数据偏差较大。附上程序,希望各位大神帮忙看看。谢谢了
/*
*********************************************************************************************************
*
* 模块名称 : 主程序模块。
* 文件名称 : main.c
* 说 明 :
*
*********************************************************************************************************
*/
#include "stm32f10x.h"
#include <stdio.h>
void RCC_HSE_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void EXTI_Configuration(void);
void USART1_Configuration(void);
void TIM2_Configuration(void);
void Uart1_PutChar(u32 ch);
u32 Square_count=0; //方波个数计数
u32 Square_counter=0; //1分钟方波个数
u8 Minute_counter=0; //时间计数
u8 Minute_flag=0; //1分钟到标志
u8 Tx_flag=0; //串口发送数据标志
int i = 0;
int main(void)
{
RCC_ClocksTypeDef RCC_Clock;
RCC_ClocksTypeDef *RCC_Clocks=&RCC_Clock;
char high,low;
//char mid_high,mid_low;
RCC_HSE_Configuration(); /*设置系统时钟为外部时钟*/
GPIO_Configuration();/*设置GPIO端口*/
TIM2_Configuration();/*设置TIM*/
EXTI_Configuration(); /*设置EXTI*/
USART1_Configuration();/*设置USART*/
NVIC_Configuration();/*设置NVIC*/
RCC_GetClocksFreq(RCC_Clocks);
while(1)
{
high=(char)(Square_counter >> 8);
Uart1_PutChar(high);
i=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10);
if(Tx_flag==1)
{
high=(char)(Square_counter >> 8); //获取计数值的高8位
//mid_high=(char)((Square_counter >> 16)&0xff);//获取计数值的中间高8位
//mid_low=(char)((Square_counter >> 8)&0xff);//获取计数值的中间低8位
low=(char)(Square_counter&0xff); //获取计数值的低8位
Uart1_PutChar(high); //发送高8位
//Uart1_PutChar(mid_high); //发送中间高8位
//Uart1_PutChar(mid_low); //发送中间低8位
Uart1_PutChar(low); //发送低8位
Tx_flag=0; //清除串口发送标志
}
else
{
;
}
}
}
/*
*********************************************************************************************************
* 函 数 名: RCC_HSE_Configuration()
* 功能说明: 主程序调用初始化系统时钟
* 返 回 值: 无
*********************************************************************************************************
*/
void RCC_HSE_Configuration(void) //设置系统时钟,也可直接调用SystemInit();系统时钟自动初始化为72M
{
RCC_DeInit();//将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE),HSE晶振打开(On)
if(RCC_WaitForHSEStartUp()==SUCCESS)//等待HSE起振,SUCCESS:HSE晶振稳定且就绪
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)RCC_SYSCLK_Div1--AHB时钟=系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)RCC_HCLK_Div1--APB2时钟=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)RCC_HCLK_Div2--APB1时钟=HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL时钟源及倍频系数
RCC_PLLCmd(ENABLE);//PLL使能
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位(PLL准备好标志)设置与否
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟SYSCLK
while(RCC_GetSYSCLKSource()!=0x08);//0x08 LL作为系统时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟以及辅助串口功能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); //使能USART1时钟
}
}
/*
*********************************************************************************************************
* 函 数 名: Uart1_PutChar(u32 ch)
* 功能说明: 串口1发送数据函数
* 返 回 值: 无
*********************************************************************************************************
*/
void Uart1_PutChar(u32 ch)
{
/* 写一个字节到USART1 */
USART_SendData(USART1, ch);
/* 等待发送结束 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET);
}
/*
*********************************************************************************************************
* 函数名称 : GPIO_Configuration
* 说 明 : 设置GPIO各个端口功能
* 输入参数 : 无
*********************************************************************************************************
*/
void GPIO_Configuration()
{
/*定义GPIO初始化结构体GPIO_InitStructure*/
GPIO_InitTypeDef GPIO_InitStructure;
/*设置外部中断引脚PB.10浮空输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);//定义PB.10口为外部中断输入通道
GPIO_Init(GPIOB,&GPIO_InitStructure);
/*设置USART1的Tx脚(PA.9)为推挽输出功能*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*设置USART1的Rx脚(PA.10)为浮空输入功能*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*
*********************************************************************************************************
* 函数名称 : TIM2_Configuration()
* 说 明 : 主程序调用初始化定时器2
* 输入参数 : 无
*********************************************************************************************************
*/
void TIM2_Configuration(void) //定时器2初始化 定时1S
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义TIM的结构体定义
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清空标志位
TIM_TimeBaseStructure.TIM_Period = 19999; //初值 通过预分频计算值和中断计数初值确定定时时间
TIM_TimeBaseStructure.TIM_Prescaler = 3599; //定时设置预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE); //使能中断
TIM_Cmd(TIM2, ENABLE); //TIM2使能计数
}
/*
*********************************************************************************************************
*
* 函数名称 : NVIC_Configuration
* 说 明 : 设置NVIC各个端口功能
* 输入参数 : 无
*********************************************************************************************************
*/
void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure; //定义初始化结构体NVIC_InitStructure
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//外部中断优先级设置
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //中断口设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//TIM2中断
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //中断口设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*********************************************************************************************************
*
* 函数名称 : EXTI_Configuration
* 说 明 : 设置NVIC各个端口功能
* 输入参数 : 无
*********************************************************************************************************
*/
void EXTI_Configuration()
{
EXTI_InitTypeDef EXTI_InitStructure; //定义EXIT初始化结构体EXTI_InitStructure
EXTI_ClearFlag(EXTI_Line10); //清除中断标志
EXTI_InitStructure.EXTI_Line=EXTI_Line10; //选择待使能外部中断线路1
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置EXTI线路为中断请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
/*
*********************************************************************************************************
*
* 函数名称 : USART1_Configuration()
* 说 明 : 主程序调用初始化串口通讯
* 输入参数 : 无
*********************************************************************************************************
*/
void USART1_Configuration(void) //串口初始化函数
{
USART_InitTypeDef USART_InitStructure; //定义结构体
USART_InitStructure.USART_BaudRate = 9600; //波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //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; //打开Rx接收和Tx发送功能
USART_Init(USART1, &USART_InitStructure); //初始化
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //启动串口接收中断
USART_Cmd(USART1, ENABLE); //启动串口
USART_ClearFlag(USART1,USART_FLAG_TC); //清空发送完成标志位 解决第一个字节有时候发不出去的问题
}
|
|