?? main.c
字號:
/*
*********************************************************************************************************
*
* 模塊名稱 : 主程序模塊。
* 文件名稱 : main.c
* 版 本 : V1.0
* 說 明 : ADC采樣和濾波例程。
* 修改記錄 :
* 版本號 日期 作者 說明
* v1.0 2012-11-12 armfly ST固件庫V3.5.0版本。
*
* Copyright (C), 2010-2011, 安富萊電子 www.armfly.com
*
*********************************************************************************************************
*/
#include "stm32f10x.h" /* 如果要用ST的固件庫,必須包含這個文件 */
#include <stdio.h> /* 因為用到了printf函數,所以必須包含這個文件 */
/* 定義例程名和例程發布日期 */
#define EXAMPLE_NAME "GPIO口模擬串口"
#define EXAMPLE_DATE "2012-11-12"
#define DEMO_VER "1.0"
#define TXD_high() GPIO_SetBits(GPIOA, GPIO_Pin_9)
#define TXD_low() GPIO_ResetBits(GPIOA, GPIO_Pin_9)
#define BaudRateUsed 9600
#define SendingDelay 104
/* 僅允許本文件內調用的函數聲明 */
static void PrintfLogo(void);
static void GPIO_Configuration(void);
static void Delay_Ms(__IO uint32_t nTime);
static void EXTI_Configuration(void);
static void TIM1_Configuration(void);
static void TIM2_Configuration(void);
static void TIM3_Configuration(void);
static void PrintfAnswer(void);
/* 外部文件可以調用的函數聲明 */
void SendOneByte(uint8_t datatoSend);
__IO uint32_t TimingDelay;
uint8_t dataReceived[100];
uint8_t Logo[]={"Hello, C!\r\n"};
__IO uint8_t receivedFlag;
__IO uint8_t receivedNum, tmpreceivedNum;
uint16_t g_usAdcValue; /* ADC 采樣值的平均值 */
/*
*********************************************************************************************************
* 函 數 名: main
* 功能說明: c程序入口
* 形 參:無
* 返 回 值: 錯誤代碼(無需處理)
*********************************************************************************************************
*/
int main(void)
{
/*
由于ST固件庫的啟動文件已經執行了CPU系統時鐘的初始化,所以不必再次重復配置系統時鐘。
啟動文件配置了CPU主時鐘頻率、內部Flash訪問速度和可選的外部SRAM FSMC初始化。
系統時鐘缺省配置為72MHz,如果需要更改,可以修改:
\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c
中配置系統時鐘的宏。
*/
uint8_t i;
/* IO配置 */
GPIO_Configuration();
/* 配置外部中斷 */
EXTI_Configuration();
/* TIM1初始化,用于接收 */
TIM1_Configuration();
/* TIM2初始化,用于判斷數據是否接收完成 */
TIM2_Configuration();
/* TIM3初始化,用于發送 */
TIM3_Configuration();
/* 直接調用模擬串口發送函數 */
SendOneByte('H');
SendOneByte('e');
SendOneByte('l');
SendOneByte('l');
SendOneByte('o');
SendOneByte(',');
SendOneByte('C');
SendOneByte('!');
SendOneByte('\r');
SendOneByte('\n');
/* 打印例程Logo,間接調用模擬串口發送函數 */
PrintfLogo();
/* 進入主程序循環體 */
while (1)
{
if(receivedFlag)
{
/* 清除接收完成標志位 */
receivedFlag = 0;
/* 返回接收到的數據 */
for(i = 0; i < tmpreceivedNum; i++)
SendOneByte(dataReceived[i]);
/* 清空接收緩存 */
for(i = 0; i < tmpreceivedNum; i++)
dataReceived[i] = 0;
/* 返回模擬對話數據 */
PrintfAnswer();
/* 接收數據長度清零 */
tmpreceivedNum = 0;
}
}
}
/*
*********************************************************************************************************
* 函 數 名: GPIO_Configuration
* 功能說明: 配置PA9為TXD,PA10做RXD
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能 GPIOA clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
/* 防止上電后的誤判 */
GPIO_SetBits(GPIOA, GPIO_Pin_9);
/* 配置PA9為推挽輸出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置PA10為浮空輸入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
*********************************************************************************************************
* 函 數 名: EXTI_Configuration
* 功能說明: 配置PA10上的下降沿觸發外部中斷
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable the AFIO Clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
/* Configure Button EXTI line */
EXTI_InitStructure.EXTI_Line = EXTI_Line10;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set Button EXTI Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*********************************************************************************************************
* 函 數 名: TIM1_Configuration
* 功能說明: 配置TIM1
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void TIM1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = SendingDelay -1;
TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update);
/* 開啟TIM1的中斷 */
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
/* 選擇TIM2的中斷通道 */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
/* 搶占式中斷優先級設置為0 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
/* 響應式中斷優先級設置為0 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
/* 使能中斷 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*********************************************************************************************************
* 函 數 名: TIM2_Configuration
* 功能說明: 配置TIM1
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update);
/* 開啟TIM1的中斷 */
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
/* 選擇TIM2的中斷通道 */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
/* 搶占式中斷優先級設置為0 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
/* 響應式中斷優先級設置為0 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
/* 使能中斷 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
*********************************************************************************************************
* 函 數 名: TIM3_Configuration
* 功能說明: 配置TIM1
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 65535 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_Cmd(TIM3,ENABLE);
}
/*
*********************************************************************************************************
* 函 數 名: Delay_Ms
* 功能說明: 延時
* 形 參:nTime,單位為uS* 返 回 值: 無
*********************************************************************************************************
*/
void Delay_Ms(__IO uint32_t nTime)
{
uint16_t tmp;
tmp = TIM_GetCounter(TIM3);
if(tmp + nTime <= 65535)
while( (TIM_GetCounter(TIM3) - tmp) < nTime );
else
{
TIM_SetCounter(TIM3, 0);
while( TIM_GetCounter(TIM3) < nTime );
}
}
/*
*********************************************************************************************************
* 函 數 名: SendOneByte
* 功能說明: 模擬串口發送一字節數據
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
void SendOneByte(uint8_t datatoSend)
{
uint8_t i, tmp;
/* Start bit */
TXD_low();
Delay_Ms(SendingDelay);
for(i = 0; i < 8; i++)
{
tmp = (datatoSend >> i) & 0x01;
if(tmp == 0)
{
TXD_low();
Delay_Ms(SendingDelay); //0
}
else
{
TXD_high();
Delay_Ms(SendingDelay); //1
}
}
/* Stop bit */
TXD_high();
Delay_Ms(SendingDelay);
}
/*
*********************************************************************************************************
* 函 數 名: PrintfLogo
* 功能說明: 打印例程名稱和例程發布日期, 接上串口線后,打開PC機的超級終端軟件可以觀察結果
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void PrintfLogo(void)
{
printf("*************************************************************\r\n");
printf("* 例程名稱 : %s\r\n", EXAMPLE_NAME); /* 打印例程名稱 */
printf("* 例程版本 : %s\r\n", DEMO_VER); /* 打印例程版本 */
printf("* 發布日期 : %s\r\n", EXAMPLE_DATE); /* 打印例程日期 */
/* 打印ST固件庫版本,這3個定義宏在stm32f10x.h文件中 */
printf("* 固件庫版本 : %d.%d.%d\r\n", __STM32F10X_STDPERIPH_VERSION_MAIN,
__STM32F10X_STDPERIPH_VERSION_SUB1,__STM32F10X_STDPERIPH_VERSION_SUB2);
printf("* \n\r"); /* 打印一行空格 */
printf("* QQ : 1295744630 \r\n");
printf("* Email : armfly@qq.com \r\n");
printf("* Copyright www.armfly.com 安富萊電子\r\n");
printf("*************************************************************\r\n");
printf("請通過串口調試助手發送數據,本例程會將這些數據通過串口原樣返回。\r\n\r\n");
}
/*
*********************************************************************************************************
* 函 數 名: PrintfLogo
* 功能說明: 隨機打印模擬對話
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
static void PrintfAnswer(void)
{
uint16_t tmp;
tmp = TIM_GetCounter(TIM3);
switch(tmp % 9)
{
case 0:
printf("\r\n--雷工,數據已悉數返回,掰掰手指頭,有未丟?\r\n");
break;
case 1:
printf("\r\n--報告雷工,我的工作完了,輪到你檢查了!\r\n");
break;
case 2:
printf("\r\n--咦,還沒有錯?\r\n");
break;
case 3:
printf("\r\n--靠,還不出錯?\r\n");
break;
case 4:
printf("\r\n--雷工,要不,再試試?\r\n");
break;
case 5:
printf("\r\n--小雷,檢查過沒有,數據對不對?\r\n");
break;
case 6:
printf("\r\n--小雷,數據對不對?\r\n");
break;
case 7:
printf("\r\n--怎么樣,小雷,驗收通過了沒?\r\n");
break;
case 8:
printf("\r\n--小雷,我的支付寶是168 168 168 168\r\n");
break;
default:
printf("\r\n--這句不可能出現在屏幕上\r\n");
break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -