OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2279|回复: 5

STM32F10x 跨平台移植项目

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-5-3
在线时间
5 小时
发表于 2018-5-7 20:58:32 | 显示全部楼层 |阅读模式
本帖最后由 FASTSHIFT 于 2018-5-8 15:18 编辑

玩STM32有段时间了,在享受着STM32高速运行的同时,也在想着如何简化STM32的编程。把标准外设库增加几个默认参数,二次封装成类似Arduino的API,来达到快速开发的目的。
经过一段时间的琢磨后,我成功移植了大部分常用的Arduino API,支持添加Arduino的第三方函数库,支持与标准外设库与寄存器混合使用。这样就可以像CubeMX使用库来进行快速配置初始化代码,追求速度和效率的部分使用寄存器,提高开发速度和代码可读性。

目前在STM32F103C8T6/ZET6上成功移植的API有:
   基本:
     时间:
          delay(Time_ms)
          delayMicroseconds(Time_us)
          millis()
          micros()
          TimerSet(TIMx,InterruptTime_us,Callback_function)

     输入输出:
          pinMode(Pin,Mode)
          attachInterrrupt(Pin,Trigger_Mode,Callback_function)
          digitalWrite(Pin,State)
          digitalRead(Pin)
          analogRead(Pin)
          analogWrite(Pin,DutyCycle)
          shiftOut(dataPin,clockPin,bitOrder,value)
          shiftIn(dataPin,clockPin,bitOrder)
          tone(Pin,Frequency,Time_ms)

         
     Print class //支持printf
     String class
     Stream class
      
   外设:
     Serial class
     Wire class
     SPI class



     源代码在Github搜索:Arduino For Keil

Arduino For Keil .png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-5-3
在线时间
5 小时
 楼主| 发表于 2018-5-7 21:06:21 | 显示全部楼层
本帖最后由 FASTSHIFT 于 2018-5-7 21:07 编辑

贴几个示例代码
USART与GPIO
[mw_shl_code=cpp,true]#include "FileGroup.h"

void setup()
{
        Serial.begin(115200);
        Serial.printf("C++ Version: %d\r\n",__cplusplus);
        Serial.printf("Compiling Time: %s %s\r\n",__DATE__,__TIME__);
        pinMode(PC13,OUTPUT);
        pinMode(PA0,PWM);
}

void loop()
{
        Serial.println("STM32 Serial Test!");
        delay(2000);
        
        Serial.println("Digital Write TEST:");
        for(int i=0;i<5;i++)
        {
                digitalWrite(PC13,HIGH);
                delay(1000);
                digitalWrite(PC13,LOW);
                delay(1000);
        }
        
        Serial.println("Digital Read TEST:");
        pinMode(PC13,INPUT);
        uint8_t State = digitalRead(PC13);
        Serial.printf("PC13 State is:%d\r\n",State);
        pinMode(PC13,OUTPUT);
        
        Serial.println("Analog Write TEST:");
        for(int i=0;i<5;i++)
        {
                for(int j=0;j<=1000;j++)
                {
                        analogWrite(PA0,j);
                        delay(1);
                }
                for(int j=1000;j>0;j--)
                {
                        analogWrite(PA0,j);
                        delay(1);
                }
        }
        
        Serial.println("PA0 Analog Read TEST:");
        pinMode(PA0,INPUT_ANALOG);
        uint16_t ADC_Val = analogRead(PA0);
        Serial.printf("PA0 ADC Val is:%d\r\n",ADC_Val);
        pinMode(PA0,PWM);
}

//*****************MAIN******************//
int main(void)
{
        Delay_Init();
        ADCx_Init(ADC1);
//        ADCx_DMA_Init();
        setup();
        for(;;)loop();
}[/mw_shl_code]


回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-5-3
在线时间
5 小时
 楼主| 发表于 2018-5-7 21:08:36 | 显示全部楼层
本帖最后由 FASTSHIFT 于 2018-5-7 21:09 编辑

简单的定时中断(支持配置中断优先级)
[mw_shl_code=cpp,true]#include "FileGroup.h"

void LED1()
{
        Serial.println("Timer 1 Interrupt!");
        togglePin(PA0);
}

void LED2()
{
        Serial.println("Timer 2 Interrupt!");
        togglePin(PA1);
}

void setup()
{
        Serial.begin(115200);
        pinMode(PA0,OUTPUT);
        pinMode(PA1,OUTPUT);
        TimerSet(TIM1,1000000,LED1);
        TimerSet(TIM2,100000,LED2);
        TIM_Cmd(TIM1,ENABLE);
        TIM_Cmd(TIM2,ENABLE);
}

void loop()
{
}

//*****************MAIN******************//
int main(void)
{
        Delay_Init();
        ADCx_Init(ADC1);
//        ADCx_DMA_Init();
        setup();
        for(;;)loop();
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-5-3
在线时间
5 小时
 楼主| 发表于 2018-5-7 21:12:05 | 显示全部楼层
外部中断(支持配置中断优先级)
[mw_shl_code=cpp,true]#include "FileGroup.h"

void LED()
{
        Serial.println("PA1 FALLING!");
        togglePin(PA0);
}

void setup()
{
        Serial.begin(115200);
        pinMode(PA0,OUTPUT);
        attachInterrupt(PA1,LED,FALLING);
}

void loop()
{
}

//*****************MAIN******************//
int main(void)
{
        Delay_Init();
        ADCx_Init(ADC1);
//        ADCx_DMA_Init();
        setup();
        for(;;)loop();
}[/mw_shl_code]
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-5-7 21:40:25 | 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-5-3
在线时间
5 小时
 楼主| 发表于 2018-5-8 15:18:29 | 显示全部楼层
顶一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 00:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表