最近一直都在忙蓝桥杯和期末复习,直到璐璐的邮箱提醒才发现忘了发帖,希望赶上趟。
首先,必须承认,申请的时候没有想到低功耗的程序会和普通版差异会这么大,大部分不能说自己原创。
之前看网上说这块板子是ST公司推出的一款针对STM32L0系列设计的Cortex-M0+开发板,具有 mbed 功能,支持Arduino。同时还提供 ST Morpho 扩展排针,可连接微控制器的所有周边外设。
先是最基础的定时器,毕竟,时钟的第一功能是记时嘛
#include "LED.h"
/*
* 函数名:LED_GPIO_Config
* 描述 :配置LED用到的I/O口
* 输入 :无
* 输出 :无
*/
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIOC的外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*选择要控制的GPIOC引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOC*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*PA.8 输出高*/
GPIO_SetBits(GPIOA,GPIO_Pin_8);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_12);
}
这样呢,就算是第一步了,当然也少不了液晶的操作
#include "lcd.h"
#include "stdlib.h"
#include "usart1.h"
//画笔颜色,背景颜色
u16 POINT_COLOR,BACK_COLOR=WHITE;
//写16位数据函数
void LCD_WR_DATA(u16 data)
{
LCD_RS_SET;
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
/*****************************************************************************
** 函数名称: LCD_RD_DATA
** 功能描述: 写寄存器函数
** 返回值:读到的值
*****************************************************************************/
void LCD_WR_REG(u8 data)
{
LCD_RS_CLR;//写地址
LCD_CS_CLR;
DATAOUT(data);
LCD_WR_CLR;
LCD_WR_SET;
LCD_CS_SET;
}
/*****************************************************************************
** 函数名称: LCD_RD_DATA
** 功能描述: 读LCD数据
** 返回值:读到的值
*****************************************************************************/
u16 LCD_RD_DATA(void)
{
u16 t;
LCD_GPIOB_Configuration(0);
LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
LCD_RD_SET;
t=DATAIN;
LCD_CS_SET;
LCD_GPIOB_Configuration(1);
return t;
}
/*****************************************************************************
** 函数名称: LCD_WriteReg
** 功能描述: 写寄存器
** LCD_Reg:寄存器编号
** LCD_RegValue:要写入的值
*****************************************************************************/
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{
LCD_WR_REG(LCD_Reg);
LCD_WR_DATA(LCD_RegValue);
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD_WR_REG(0x22);
}
/*****************************************************************************
** 函数名称:LCD_DisplayOn
** 功能描述: 开启LCD显示
*****************************************************************************/
void LCD_DisplayOn(void)
{
LCD_WriteReg(0x07,0x0173); //开启显示
}
/*****************************************************************************
** 函数名称: LCD_DisplayOff
** 功能描述: 关闭LCD显示
*****************************************************************************/
void LCD_DisplayOff(void)
{
LCD_WriteReg(0x07, 0x0);//关闭显示
}
//设置光标位置
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(u16 Xpos, u16 Ypos)
{
if(Horizontal_or_Vertical)
{
//横屏显示
LCD_WriteReg(0x20,Ypos);
LCD_WriteReg(0x21,319-Xpos);
}
//竖屏显示
else
{
LCD_WriteReg(0x20, Xpos);
LCD_WriteReg(0x21, Ypos);
}
}
/*****************************************************************************
** 函数名称: LCD_Scan_Dir
** 功能描述: 设置LCD的自动扫描方向
*****************************************************************************/
void LCD_Scan(void)
{
u16 regval=0;
regval|=L2R_U2D; //从左到右,从上到下
regval|=1<<12;
LCD_WriteReg(0X03,regval);
}
/*****************************************************************************
** 函数名称: LCD_DrawPoint
** 功能描述: 画点
** x:0~239
** y:0~319
** POINT_COLOR:此点的颜色
*****************************************************************************/
void LCD_DrawPoint(u16 x,u16 y,u16 Color)
{
LCD_SetCursor(x,y);//设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
LCD_WR_DATA(Color);
}
/*****************************************************************************
** 函数名称: LCD_GPIO_Configuration
** 功能描述: LCD_IO口配置
*****************************************************************************/
void LCD_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6; //GPIO_Pin_10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIOC
GPIO_SetBits(GPIOC,GPIO_Pin_10|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //
GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_All);
}
/*****************************************************************************
** 函数名称: LCD_GPIOB_Configuration
** 功能描述: lcd数据传输用到的IO配置
*****************************************************************************/
void LCD_GPIOB_Configuration(u8 sel)
{
GPIO_InitTypeDef GPIO_InitStructure;
if(sel==1)
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //
GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIOB
GPIO_SetBits(GPIOB,GPIO_Pin_All);
}
else
{
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //
GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIOB
}
}
void LCD_Configuration(void)
{
LCD_GPIO_Configuration();
LCD_WriteReg(0x0000,0x0001);//可以去掉
LCD_WriteReg(0x00E5,0x78F0);
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700);
LCD_WriteReg(0x0003,0x1030);
LCD_WriteReg(0x0004,0x0000);
LCD_WriteReg(0x0008,0x0202);
LCD_WriteReg(0x0009,0x0000);
LCD_WriteReg(0x000A,0x0000);
LCD_WriteReg(0x000C,0x0000);
LCD_WriteReg(0x000D,0x0000);
LCD_WriteReg(0x000F,0x0000);
//power on sequence VGHVGL
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x0007);
LCD_WriteReg(0x0012,0x0000);
LCD_WriteReg(0x0013,0x0000);
LCD_WriteReg(0x0007,0x0000);
//vgh
LCD_WriteReg(0x0010,0x1690);
LCD_WriteReg(0x0011,0x0227);
//delayms(100);
//vregiout
LCD_WriteReg(0x0012,0x009D); //0x001b
//delayms(100);
//vom amplitude
LCD_WriteReg(0x0013,0x1900);
//delayms(100);
//vom H
LCD_WriteReg(0x0029,0x0025);
LCD_WriteReg(0x002B,0x000D);
//gamma
LCD_WriteReg(0x0030,0x0007);
LCD_WriteReg(0x0031,0x0303);
LCD_WriteReg(0x0032,0x0003);// 0006
LCD_WriteReg(0x0035,0x0206);
LCD_WriteReg(0x0036,0x0008);
LCD_WriteReg(0x0037,0x0406);
LCD_WriteReg(0x0038,0x0304);//0200
LCD_WriteReg(0x0039,0x0007);
LCD_WriteReg(0x003C,0x0602);// 0504
LCD_WriteReg(0x003D,0x0008);
//ram
LCD_WriteReg(0x0050,0x0000);
LCD_WriteReg(0x0051,0x00EF);
LCD_WriteReg(0x0052,0x0000);
LCD_WriteReg(0x0053,0x013F);
LCD_WriteReg(0x0060,0xA700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006A,0x0000);
//
LCD_WriteReg(0x0080,0x0000);
LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0082,0x0000);
LCD_WriteReg(0x0083,0x0000);
LCD_WriteReg(0x0084,0x0000);
LCD_WriteReg(0x0085,0x0000);
//
LCD_WriteReg(0x0090,0x0010);
LCD_WriteReg(0x0092,0x0600);
LCD_WriteReg(0x0007,0x0133);
LCD_WriteReg(0x00,0x0022);//
}
/*****************************************************************************
** 函数名称: LCD_Init
** 功能描述: LCD初始化
*****************************************************************************/
void LCD_Init(void)
{
LCD_Configuration();
LCD_Scan();
LCD_LED;//点亮背光
LCD_Clear(WHITE);
}
/*****************************************************************************
** 函数名称: LCD_Clear
** 功能描述: 清屏幕函数
** Color:要清屏的填充色
*****************************************************************************/
void LCD_Clear(u16 Color)
{
u32 index=0;
LCD_SetCursor(0x00,0x0000);//设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
for(index=0;index<76800;index++)
{
LCD_WR_DATA(Color);
}
}
即便这样其实还有功能都没有实现,实在惭愧,但是在寒假里,会通过对c51的充分学习,方便自己更深入的了解stm32的秘密。谢谢。