为了测试前面的无线模块的程序,写了一个usart操纵Windows超级终端的程序小程序。
废话少说,上代码:
1.硬件配置的头文件:
******************** (C) COPYRIGHT 2011 SDUEM ********************
* File Name : hw_config.h
* Author : wzb@sduem
* Version : V2.2.0
* Date : 05/13/2011
* Description : Hardware Configuration & Setup
*******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __HW_CONFIG_H
#define __HW_CONFIG_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
extern u32 TimingDelay; // delay used!
/* Exported macro ------------------------------------------------------------*/
/* Exported define -----------------------------------------------------------*/
#if 0
//------------define the usart using-----------
#define USART_USING USART1
#define RCC_APB2Periph_USART_USING RCC_APB2Periph_USART1
#define USART_USING_IRQChannel USART1_IRQChannel
//--------------define USART pins-------------------
#define USART_RX_PIN GPIO_Pin_10
#define USART_TX_PIN GPIO_Pin_9
//------------define the SPI using-----------
#define SPI_USING SPI1
#define RCC_APB2Periph_SPI_USING RCC_APB2Periph_SPI1
#define SPI_USING_IRQChannel SPI1_IRQChannel
//--------------define SPI pins-------------------
#define SPI_SCK_PIN GPIO_Pin_5
#define SPI_MISO_PIN GPIO_Pin_6
#define SPI_MOSI_PIN GPIO_Pin_7
//-------------------define the GPIO for USART_USING------------------
#define GPIO_FOR_USART GPIOA
//-------------------define the GPIO for SPI_USING------------------
#define GPIO_FOR_SPI GPIOA
#endif
/* Exported functions ------------------------------------------------------- */
void System_Init(void);
void RCC_Configuration(void); /*****与时钟相关的寄存器配制*****/
void USART_Configuration(void);
void SPI_Configuration(void);
//usart 送往超级终端上的字符显示
void usart_putc(u8 ch) ;
void usart_puts(u8 str[]) ;
void usart_println(void);
void usart_cls();
void usart_printArray( u8 * array, u32 arraySize) ;
void USART_EXTI_DoIt(); // Usart外部中断
void Decrement_TimingDelay(void);
void delay_us(u32 nCount);
/* External variables --------------------------------------------------------*/
#endif /*__HW_CONFIG_H*/
/******************* (C) COPYRIGHT 2011 SDUEM *****END OF FILE****/
2. usart功能函数的代码实现:
/******************** (C) COPYRIGHT 2011 SDUEM ********************
* File Name : hw_config.c
* Author : wzb@SDUEM
* Version : V2.2.0
* Date : 05/13/2011
* Description : Hardware Configuration & Setup
********************************************************************************
*
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "hw_config.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Exported variables ----------------------------------------------------------*/
u32 TimingDelay;
/* Private function prototypes -----------------------------------------------*/
static void SysTick_Configuration(void);
static void USART1_GPIO_Configuration();
static void USART1_NVIC_Configuration();
static void USART1_Configuration();
static void SPI1_GPIO_Configuration();
static void SPI1_NVIC_Configuration();
static void SPI1_Configuration();
/* ----------------------Exported functions ----------------------------------*/
/* ---------------RCC Configuration fuction -----------------------------------*/
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the system clocks
* Input : None.
* Return : None.
*******************************************************************************/
//RCC时钟配置 for the whole system
void RCC_Configuration(void) {
//定义错误状态变量
ErrorStatus HSEStartUpStatus;
//将RCC寄存器重新设置为默认值
RCC_DeInit();
//打开外部高速时钟晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) {
//设置AHB时钟(HCLK)为系统时钟
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//设置高速AHB时钟(APB2)为HCLK时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置低速AHB时钟(APB1)为HCLK的2分频
RCC_PCLK1Config(RCC_HCLK_Div2);
//设置FLASH代码延时
FLASH_SetLatency(FLASH_Latency_2);
//使能预取指缓存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL准备就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判断PLL是否是系统时钟
while(RCC_GetSYSCLKSource() != 0x08);
}
//打开GPIOA AFIO USART1 SPI1 时钟,复用功能,串口1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 | RCC_APB2Periph_SPI1, ENABLE);
}
/*******************************************************************************
* Function Name : RCC_Configuration_1
* Description : Configures the system clocks
* Input : None.
* Return : None.
*******************************************************************************/
void RCC_Configuration_1(void)
{
ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) */
RCC_DeInit(); //将RCC寄存器设备缺省值
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON); //外部高速振荡器HSE 开启
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE启动
if (HSEStartUpStatus == SUCCESS) //如果HSE晶振稳定且就绪
{
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //预取指缓存使能
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数为2延时周期
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟=系统时钟
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1); //设置APB2时钟 = HCLK
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2); //设置APB1时钟 = HCLK/2
/* ADCC
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』