极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12041|回复: 6

正在编写STM32_EASY库

[复制链接]
发表于 2013-9-23 20:38:01 | 显示全部楼层 |阅读模式
虽然STM32的官方库已经做得非常EASY了,但是对于经常手抽的小白们来说,还是要输入太多的字符,所以,我仿照了Arduino的格式做了一个库叫做:STM32_EASY!

还没做完,做个预览撒:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-9-23 21:53:51 | 显示全部楼层
有啥功能?
回复 支持 反对

使用道具 举报

发表于 2013-9-23 22:05:30 | 显示全部楼层
好好,支持完善~
回复 支持 反对

使用道具 举报

发表于 2013-9-24 09:00:04 | 显示全部楼层
本帖最后由 histamine 于 2013-9-24 09:36 编辑
  1. #include <stdint.h>
  2. #include <stm32f10x.h>
  3. #include <stm32f10x_rcc.h>
  4. #include <stm32f10x_gpio.h>
  5. #include <stm32f10x_adc.h>

  6. #define HIGH   0x01
  7. #define LOW    0x00
  8. #define OUT_PP 0b00000011
  9. #define OUT_OD 0b00000111
  10. #define OUT    OUT_PP
  11. #define IN_FT  0b00000100
  12. #define IN_PD  0b00001000
  13. #define IN_PU  0b00011000
  14. #define IN     IN_FT

  15. #define __enable_port_rcc(P) do{RCC->APB2ENR |= RCC_APB2Periph_GPIO##P;}while(0)
  16. #define __disable_port_rcc(P) do{RCC->APB2ENR &= ~RCC_APB2Periph_GPIO##P;}while(0)

  17. #define pin_set(P, N) do{GPIO##P->BSRR = GPIO_Pin_##N;}while(0)
  18. #define pin_reset(P, N) do{GPIO##P->BRR = GPIO_Pin_##N;}while(0)

  19. #define pin_read(P, N) (GPIO##P->IDR & GPIO_Pin_##N)

  20. #define port_set(P, V) do{GPIO##P->ODR = V;}while(0)
  21. #define port_read(P)  (GPIO##P->IDR)

  22. #define pin_mode(P, N, M) do{__enable_port_rcc(P); __pin_mode(GPIO##P, N, GPIO_Pin_##N, M);}while(0)
  23. __inline void __pin_mode(GPIO_TypeDef *reg_base, const uint16_t pin_num, const uint16_t gpio_pin, const uint8_t mode)
  24. {
  25.     __IO uint32_t *reg_addr = 0;
  26.     uint16_t pos = 0;
  27.     if (pin_num < 8)
  28.     {
  29.         reg_addr = &reg_base->CRL;
  30.         pos = pin_num;
  31.     }
  32.     else
  33.     {
  34.         reg_addr = &reg_base->CRH;
  35.         pos = pin_num - 8;
  36.     }

  37.     const uint16_t lshift = pos << 2;
  38.     *reg_addr &= ~(((uint32_t)0x0F) << lshift);
  39.     *reg_addr |= ((uint32_t)(mode & 0x0F)) << lshift;
  40.     if (mode == IN_PD)
  41.         reg_base->BRR = gpio_pin;
  42.     else if (mode == IN_PU)
  43.         reg_base->BSRR = gpio_pin;
  44. }

  45. #define ADC_PA0 0
  46. #define ADC_PA1 1
  47. #define ADC_PA2 2
  48. #define ADC_PA3 3
  49. #define ADC_PA4 4
  50. #define ADC_PA5 5
  51. #define ADC_PA6 6
  52. #define ADC_PA7 7
  53. #define ADC_PB0 8
  54. #define ADC_PB1 9
  55. #define ADC_PC0 10
  56. #define ADC_PC1 11
  57. #define ADC_PC2 12
  58. #define ADC_PC3 13
  59. #define ADC_PC4 14
  60. #define ADC_PC5 15

  61. #define pin_analog_read(P, N) __pin_analog_read(ADC_P##P##N)
  62. __inline uint16_t __pin_analog_read(uint8_t adc_channel)
  63. {
  64.     ADC1->SQR3 &= 0XFFFFFFE0;
  65.     ADC1->SQR3 |= adc_channel;
  66.     ADC1->CR2  |= 1 << 22;
  67.     while(!(ADC1->SR & (1 << 1)));
  68.     return ADC1->DR;
  69. }

  70. #define pin_mode_ain(P, N) do{__enable_port_rcc(P); __pin_mode_ain(ADC_P##P##N);}while(0)
  71. __inline void __pin_mode_ain(const uint16_t adc_channel)
  72. {
  73.     RCC->APB2ENR |= 1 << 9;
  74.     RCC->APB2RSTR |= 1 << 9;
  75.     RCC->APB2RSTR &= ~(1 << 9);
  76.     RCC->CFGR &= ~(3 << 14);
  77.     RCC->CFGR |= 2 << 14;

  78.     ADC1->CR1 &= 0XF0FFFF;
  79.     ADC1->CR1 |= 0 << 16;
  80.     ADC1->CR1 &= ~(1 << 8);
  81.     ADC1->CR2 &= ~(1 << 1);
  82.     ADC1->CR2 &= ~(7 << 17);
  83.     ADC1->CR2 |= 7 << 17;
  84.     ADC1->CR2 |= 1 << 20;
  85.     ADC1->CR2 &= ~(1 << 11);
  86.     ADC1->SQR1 &= ~(0XF << 20);
  87.     ADC1->SQR1 &= 0 << 20;

  88.     if (adc_channel > 9)
  89.     {
  90.         const uint8_t adc_lshift = (adc_channel - 10) * 3;
  91.         ADC1->SMPR1 &= ~(((uint32_t)0x7) << adc_lshift);
  92.         ADC1->SMPR1 |= ((uint32_t)0x7) << adc_lshift;
  93.     }
  94.     else
  95.     {
  96.         const uint8_t adc_lshift = adc_channel * 3;
  97.         ADC1->SMPR2 &= ~(((uint32_t)0x7) << adc_lshift);
  98.         ADC1->SMPR2 |= ((uint32_t)0x7) << adc_lshift;
  99.     }

  100.     ADC1->CR2 |= 1 << 0;
  101.     ADC1->CR2 |= 1 << 3;
  102.     while(ADC1->CR2 & 1 << 3);
  103.     ADC1->CR2 |= 1 << 2;
  104.     while(ADC1->CR2 & 1 << 2);
  105. }
复制代码
未测试
  1.     pin_mode_ain(A, 0);
  2.     uint16_t adc_value = pin_analog_read(A, 0);
  3.     pin_mode(B, 1, OUT);
  4.     pin_set(B, 1);
  5.     pin_reset(B, 1);
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-9-24 09:36:38 | 显示全部楼层
这个要支持。。。对于刚开始使用STM32的吾等小白来说。。。STM32太复杂了。。。。
回复 支持 反对

使用道具 举报

发表于 2013-9-24 19:16:46 | 显示全部楼层
嗯  不错  我也不喜欢STM32的库,函数名太复杂了

不过做STM32 Arduino适配的有很多

例如leaflabs等,建议楼主参考一下,别做太多无用功
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-24 20:41:04 | 显示全部楼层
谢谢支持,我主要是做关于液晶屏等外设操作的函数库
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 23:58 , Processed in 0.045892 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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