由于入门第一步那个教程有些复杂,这里更新一下入门教程,并编写一个延时函数
第一步:下载我上传的资源包,解压后有四个文件夹,如图所示:简单介绍一下这四个文件夹,第一个文件夹是工程的配置文件和启动文件,文件夹需要做包含处理。
第二个文件夹是固件库,start是内核的和芯片的一些.h文件,需要做包含处理;Library是外设的固件库,有.c和.h文件,用的时候添加就行,.h文件需要做包含处理。
第三个文件夹MDK_ARM,是项目工程文件,就不用说了。
第四个是USER文件夹,我们自己写的程序可以放在这里,需要做包含处理。
第二步:打开MDK_ARM文件夹,打开项目工程文件。我们需要重新添加.h文件的地址。刚刚我在上面说了有四个文件夹,除了MDK_ARM其余的都需要包含处理,现在处理一下。
点击运行,结果如图所示:0错误,0警告。第二步,我们写一个延时函数,首先新建一个Window_Api.c和.h,延时函数我们可以使用系统时钟来实现,也就是Systick,所以包含一下头文件
先写一个毫秒级的延时函数,如图
再写一个微妙级别的延时函数,如图
延时函数到毫秒基本就行了,如果是秒级别的延时,太浪费系统资源了,我就不写秒级别的了。接下来测试一下,写个LED灯来演示一下。
我们配置PA2为LED灯的控制引脚,低电平电亮,现需要初始化引脚,设置为推挽输出。
在主函数里面我们写一个循环,间隔0.5秒LED切换一次状态,先测试毫秒级,程序如图
结果如我们所想的一样。
再测试微秒级,程序如图然而结果并不理想,LED并没有如我们期望的那样进行翻转,考虑到这个是硬件置位,1微秒级别可能是太小了,来不及置位,所以将1us更改为10us级别,即
现在结果如我们所想的一样,解决问题,上述原因不一定正确,有更好的见解可以评论,欢迎指导。
程序如下:
Windows_Api.c
#include "Windows_Api.h"
void Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000);
for(i=0;i<ms;i++)
{
/* 当计数器的值减小到0的时候,CRTL寄存器的位16会置1*/
/* 当置1时,读取该位会清0*/
while( !((SysTick->CTRL)&(1<<16)) );
}
/* 关闭SysTick定时器*/
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
void Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(SystemCoreClock/100000);
for(i=0;i<us;i++)
{
/* 当计数器的值减小到0的时候,CRTL寄存器的位16会置1*/
while( !((SysTick->CTRL)&(1<<16)) );
}
/* 关闭SysTick定时器*/
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
void APP_Gpio_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* 初始化结构体 */
GPIO_InitStruct.GPIO_Mode = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(CMSDK_PA, &GPIO_InitStruct);
GPIO_SetBits(CMSDK_PA, GPIO_Pin_2);
}
void Windows_Api_Init(void)
{
APP_Gpio_Init();
}
Windows_Api.h
#ifndef __WINDOWS_API_H
#define __WINDOWS_API_H
#include "pt32x031.h"
#include "pt32x031_sys.h"
#include "pt32x031_gpio.h"
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Windows_Api_Init(void);
#endif