TA的每日心情 | 奋斗 2016-8-25 12:42 |
---|
签到天数: 692 天 连续签到: 1 天 [LV.9]以坛为家II
|
本帖最后由 fengye5340 于 2012-11-29 19:53 编辑
STM32F0 #02进程一:
自从收到了爱板网给的STM32F0小板后,就开始趁着休息时间鼓弄,呵呵。原来的小板已经送给朋友一块,给同事玩一块,好久没有摸它,感觉真是太陌生了。本人拿到这个小板后,面前做了三个方面的工作。
第一个,给板子增加了一个8MHZ的外部晶振,以实现更精确的时钟和延时控制。 这个板子的器件都用0603的贴片,我们这里以0805最多,0603的型号不全,后来又去了库里才把上面的几个元件找全,真个费劲啊,焊的时间很短,还不够找一个器件的功夫。焊完后,用了程序一测,OK!高兴的我立马去吃饭了。
第二个,利用SYSTICK定时器实现了豪秒级精确延时,目前仅用来 测试LED灯,后续,如果需要更精准的延时,会增加定时器模块。把程序下载进去后,小灯延时正确无误。
第三个,增加了串口通信模块。这个是从偶的LM3S系列串口程序上移植过来的,虽说串口通信简单,不过STM32F0的串口API库还是有不少函数的,如果前期不阅读好******usart.c那个库文件,整明白里面的串口API函数,编写这个模块还是需要花费一点时间的。有的人会说,STM32不是有现成的串口模块嘛,我会说,这个还是有很多差别。毕竟M0是小弟弟,武器不可能比哥哥的好。还有就是串口模块的中断方式实现,这个需要先在 NVIC里面做个配置,然后在***_it.c 增加中断处理即可,中间只要处理正确,就可以实现了。
下面把把图传上来!感谢爱板网论坛!
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
串口部分源码;
/*********************************Copyright (c)*********************************
* fengye5340@163.com
******************************************************************************
* 文件名称:UART_51R8T6.C
* 描 述:串口通信模块
* 创 建 者: fengye5340
* 创建日期:
* 修 改 者:
* 修改日期: 2012-10-29
* 版 本: v1.0.0
******************************************************************************
* attention
*
******************************************************************************
*/
/*Includes --------------------------------------------------------------------*/
#include "stm32f0xx_usart.h"
#include "UART_51R8T6.H"
#include <stdarg.h>
#include <stdio.h>
/* 类型定义 typedef-----------------------------------------------------------*/
/* 预定义字符 ------------------------------------------------------------*/
/* 宏定义 -------------------------------------------------------------*/
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
/* 变量定义 ---------------------------------------------------------*/
/*******************************************************************************
* 函数名称: Uart_Init()
* 功能描述: 串口初始化
* 输入参数: void
* 返回参数: 无
********************************************************************************/
void Uart_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE); // 使能GPIOB端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 使能串口1时钟
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
/////////////////////////////////////////////////////////////////////////////////////
/*
* USART1_TX -> PA9 , USART1_RX -> PA10
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/////////////////////////////////////////////////////////////////////////////////////
USART_InitStructure.USART_BaudRate = 9600; //设置串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据位
USART_InitStructure.USART_StopBits = USART_StopBits_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; //设置工作模式
USART_Init(USART1, &USART_InitStructure); //串口配置
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE); //打开中断
USART_Cmd(USART1, ENABLE);//使能串口1
}
/*******************************************************************************
* 函数名称: Uart_Put_Char()
* 功能描述: 通过UART发送一个字符
* 输入参数: void
* 返回参数: 无
********************************************************************************/
void Uart_Put_Char(unsigned char c)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1,c);
}
/*******************************************************************************
* 函数名称: Uart_Put_string
* 功能描述: 通过UART发送字符串
* 输入参数: void
* 返回参数: 无
********************************************************************************/
void Uart_Put_string(unsigned char *s)
{
while (*s != '\0')
{
Uart_Put_Char(*(s++));
}
}
/*******************************************************************************
* 函数名称: Uart_Put_string
* 功能描述: 通过UART发送字符串
* 输入参数: void
* 返回参数: 无
********************************************************************************/
void Uart_Char_Num( unsigned char *pucBuffer, unsigned long ulCount )
{
while(ulCount--)
{
Uart_Put_Char(*pucBuffer++);
}
}
/*******************************************************************************
* 函数名称: Uart_Get_Char()
* 功能描述: 通过UART接收一个字符
* 输入参数: void
* 返回参数: 无
********************************************************************************/
unsigned char Uart_Get_Char(void)
{
unsigned char temp;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收为空
temp = (unsigned char)(USART_ReceiveData(USART1));
return(temp);
}
/*******************************************************************************
函数名称:Display_ConfigMenu(void)
功 能:默认配置下的显示菜单
参 数:无
返回值 :接收到的字符
********************************************************************************/
void Display_ConfigMenu(void)
{
Uart_Put_string("---------STM32F0 DISCOVERY EVALUATION BOARD---------\r\n");
Uart_Put_string("------------------EEboard爱板网论坛-----------------\r\n");
Uart_Put_string("------------------ADC中断方式采集程序----——-------------\r\n");
Uart_Put_string("------------------fengye5340@163.com----------------\r\n");
Uart_Put_string("-------------------2012年11月22日--------------------\r\n");
}
/*******************************************************************************
函数名称:PUTCHAR_PROTOTYPE
功 能:串口实现Printf()函数功能
参 数:无
返回值 :
********************************************************************************/
PUTCHAR_PROTOTYPE
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
USART_SendData(USART1,(uint8_t)ch);
return (ch);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
中断部分;
extern unsigned char g_inbuf1[2]; // 定义数据缓存器1--串口1缓冲器
/*******************************************************************************
* 函数名称: USART1_IRQHandler()
* 功能描述: 串口1中断处理函数
* 输入参数: void
* 返回参数: 无
* 说 明:可以随时用 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);来关闭中断响应。
********************************************************************************/
void USART1_IRQHandler(void)
{
unsigned char uCh;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收为空
uCh = (unsigned char)(USART_ReceiveData(USART1)); // 接收单个字符
g_inbuf1[0] = uCh ;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
中断管理
/********************************************************************************
函数名称:NVIC_config(void)
功 能:NVIC配置
参 数:无
返 回 值:无
*********************************************************************************/
void NVIC_config(void)
{
/*1--串口中断管理*/
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 可以继续增加,设置中断优先级
}
|
|