Skip to content

Commit 82311e0

Browse files
author
nulllab
committed
review gpio adc pwm
1 parent bd69894 commit 82311e0

File tree

4 files changed

+80
-19
lines changed

4 files changed

+80
-19
lines changed

cores/w806/Arduino.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ void yield(void);
5656
#define INPUT_PULLUP 0x2
5757
#define OUTPUT_OD 0x03
5858
#define INPUT_PULLDOWN 0x4
59+
#define ANALOG_INPUT 0x5
60+
#define PWM_OUT 0x6
5961

6062
// undefine mathlib's pi if encountered
6163
#ifdef PI
@@ -154,7 +156,7 @@ void pinMode(uint8_t pin, uint8_t mode);
154156
void digitalWrite(uint8_t pin, uint8_t val);
155157

156158
uint8_t digitalRead(uint8_t pin);
157-
159+
158160
#define ADC8BIT 0xFF
159161
#define ADC16BIT 0xFFFF
160162
void analogReadResolution(uint8_t);

cores/w806/wiring.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,7 @@ void init()
4141
{
4242
HAL_Init();
4343
__HAL_RCC_GPIO_CLK_ENABLE();
44+
__HAL_RCC_ADC_CLK_ENABLE();
45+
__HAL_RCC_PWM_CLK_ENABLE();
4446
}
4547

cores/w806/wiring_analog.c

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
#include "pins_arduino.h"
2828
#include "./include/driver/wm_adc.h"
29+
#include "Arduino.h"
2930

3031
#define ADC_NORMAL (0U) /*polling mode*/
3132
#define ADC_IT (1U) /*interrupt mode*/
@@ -85,9 +86,9 @@ int analogRead(uint8_t pin) /*all ADC channel range is 0-2.4V*/
8586
{
8687
channel_index = (uint16_t)g_APinDescription[pin].ulAnalogChannel >> 8; //ADC_ANA_CR_CH_0
8788

88-
if (g_pinStatus[pin] != PIN_ATTR_ANALOG)
89+
if (g_pinStatus[pin] != ANALOG_INPUT)
8990
{
90-
g_pinStatus[pin] = PIN_ATTR_ANALOG;
91+
g_pinStatus[pin] = ANALOG_INPUT;
9192

9293
adcPinState[channel_index].pin = pin;
9394
adcPinState[channel_index].hadc.Instance = ADC;
@@ -118,6 +119,29 @@ int analogRead(uint8_t pin) /*all ADC channel range is 0-2.4V*/
118119
return val & adcResolution;
119120
}
120121

122+
123+
void disable_adc(uint8_t pin) /*disable pin's ADC channel function*/
124+
{
125+
#if (ADC_MODE == ADC_IT)
126+
HAL_NVIC_DisableIRQ(ADC_IRQn);
127+
#else
128+
129+
// uint8_t channel_index = 0;
130+
ADC_HandleTypeDef hadc;
131+
if (g_APinDescription[pin].ulPinAttribute & PIN_ATTR_ANALOG)
132+
{
133+
// channel_index = (uint16_t)g_APinDescription[pin].ulAnalogChannel >> 8; //ADC_ANA_CR_CH_0
134+
hadc.Instance = ADC;
135+
hadc.Init.channel = g_APinDescription[pin].ulAnalogChannel; //channel[ch];
136+
hadc.Init.freq = 1000;
137+
hadc.offset = ADC_DEFAULT_OFFSET;
138+
}
139+
140+
HAL_ADC_Stop(&hadc);
141+
#endif
142+
}
143+
144+
121145
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
122146
{
123147
}
@@ -148,7 +172,6 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
148172
{
149173
if (hadc->Instance == ADC)
150174
{
151-
__HAL_RCC_ADC_CLK_ENABLE();
152175
// __HAL_RCC_GPIO_CLK_ENABLE();
153176

154177
//ADC_CHANNEL_0 : PA1
@@ -184,7 +207,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
184207
__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_2);
185208
}
186209
#if (ADC_MODE == ADC_IT)
187-
// 如果用到中断方式需要使能中断
210+
// 如果用到中断方式需要使能中�
188211
HAL_NVIC_SetPriority(ADC_IRQn, 0);
189212
HAL_NVIC_EnableIRQ(ADC_IRQn);
190213
#endif
@@ -199,7 +222,7 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef *hadc)
199222
{
200223
if (hadc->Init.channel == adcPinState[i].hadc.Init.channel)
201224
{
202-
if (g_pinStatus[adcPinState[i].pin] == PIN_ATTR_ANALOG)
225+
if (g_pinStatus[adcPinState[i].pin] == ANALOG_INPUT)
203226
{
204227
g_pinStatus[adcPinState[i].pin] = PIN_ATTR_NONE;
205228
HAL_GPIO_DeInit(GPIOA, adcPinState[i].pin);
@@ -217,13 +240,10 @@ void analogWrite(uint32_t pin, uint32_t val)
217240
uint8_t channel_index = 0;
218241
if (g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) /*this pin has pwm attr*/
219242
{
220-
printf("init pin {%d}\r\n", pin);
221243
channel_index = (uint16_t)g_APinDescription[pin].ulPWMChannel;
222-
if (g_pinStatus[pin] != PIN_ATTR_PWM) /*need init this pin first*/
244+
if (g_pinStatus[pin] != PWM_OUT) /*need init this pin first*/
223245
{
224-
225-
g_pinStatus[pin] = PIN_ATTR_PWM;
226-
246+
g_pinStatus[pin] = PWM_OUT;
227247
pwmPinState[channel_index].pin = pin;
228248
pwmPinState[channel_index].hpwm.Instance = PWM;
229249
pwmPinState[channel_index].hpwm.Init.AutoReloadPreload = PWM_AUTORELOAD_PRELOAD_ENABLE;
@@ -232,8 +252,7 @@ void analogWrite(uint32_t pin, uint32_t val)
232252
pwmPinState[channel_index].hpwm.Init.Prescaler = 312; //40M / 312 = 12.8K //分频 1M
233253
pwmPinState[channel_index].hpwm.Init.Period = 255; // 12.8K / 256 = 500HZ
234254
pwmPinState[channel_index].hpwm.Init.Pulse = 100; // (100/256)% DUTY
235-
pwmPinState[channel_index].hpwm.Init.OutMode = PWM_OUT_MODE_INDEPENDENT; //通道独立输出
236-
255+
pwmPinState[channel_index].hpwm.Init.OutMode = PWM_OUT_MODE_INDEPENDENT;
237256
pwmPinState[channel_index].hpwm.Channel = channel_index;
238257
HAL_PWM_Init(&(pwmPinState[channel_index].hpwm));
239258
HAL_PWM_Start(&(pwmPinState[channel_index].hpwm), channel_index);
@@ -248,6 +267,21 @@ void analogWrite(uint32_t pin, uint32_t val)
248267
}
249268
}
250269

270+
void disable_pwm(uint8_t pin) /*disable pin's ADC channel function*/
271+
{
272+
uint8_t channel_index = 0;
273+
PWM_HandleTypeDef hpwm;
274+
if (g_APinDescription[pin].ulPinAttribute & PIN_ATTR_PWM) /*this pin has pwm attr*/
275+
{
276+
channel_index = (uint16_t)g_APinDescription[pin].ulPWMChannel;
277+
278+
hpwm.Instance = PWM;
279+
hpwm.Channel = channel_index;
280+
}
281+
HAL_PWM_Stop(&hpwm, channel_index);
282+
}
283+
284+
251285
void HAL_PWM_MspInit(PWM_HandleTypeDef *hpwm)
252286
{
253287
for (int i = 0; i < PWM_COUNT; i++)
@@ -256,8 +290,6 @@ void HAL_PWM_MspInit(PWM_HandleTypeDef *hpwm)
256290
{
257291
if (g_pinStatus[pwmPinState[i].pin] == PIN_ATTR_PWM)
258292
{
259-
__HAL_RCC_PWM_CLK_ENABLE();
260-
261293
if (hpwm->Channel == PWM_CH0)
262294
{
263295
__HAL_AFIO_REMAP_PWM0(g_APinDescription[pwmPinState[i].pin].pPort, g_APinDescription[pwmPinState[i].pin].ulPin);

cores/w806/wiring_digital.c

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@
2828
#include "Arduino.h"
2929
#include "pins_arduino.h"
3030
#include "./include/driver/wm_gpio.h"
31+
#include "variant.h"
3132

3233
void pinMode(uint8_t pin, uint8_t mode)
3334
{
3435
GPIO_InitTypeDef GPIO_InitStruct = {0};
3536
GPIO_TypeDef *port = (pin > 15)? GPIOB:GPIOA;
3637
if (pin > 15) { pin -= 16; }
37-
38+
g_pinStatus[pin] = mode;
3839
GPIO_InitStruct.Pin = 1<<pin;
3940
switch (mode)
4041
{
@@ -60,16 +61,28 @@ void pinMode(uint8_t pin, uint8_t mode)
6061

6162
HAL_GPIO_Init(port, &GPIO_InitStruct);
6263
}
63-
/*
64-
static void __turnOffPWM(uint8_t timer)
64+
extern void disable_pwm(uint8_t pin);
65+
static void __turnOffPWM(uint8_t pin)
6566
{
67+
disable_pwm(pin);
68+
}
6669

70+
extern void disable_adc(uint8_t pin);
71+
static void __turnOffADC(uint8_t pin)
72+
{
73+
disable_adc(pin);
6774
}
68-
*/
75+
6976
void digitalWrite(uint8_t pin, uint8_t val)
7077
{
7178
GPIO_TypeDef *port = (pin > 15)? GPIOB:GPIOA;
7279
if (pin > 15) { pin -= 16; }
80+
if (g_pinStatus[pin] == PWM_OUT) {
81+
__turnOffPWM(pin);
82+
} else if (g_pinStatus[pin] == ANALOG_INPUT) {
83+
__turnOffADC(pin);
84+
}
85+
g_pinStatus[pin] = OUTPUT_OD;
7386
HAL_GPIO_WritePin(port, 1 << pin, (GPIO_PinState)val);
7487
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, (GPIO_PinState)val);
7588
}
@@ -78,12 +91,24 @@ uint8_t digitalRead(uint8_t pin)
7891
{
7992
GPIO_TypeDef *port = (pin > 15)? GPIOB:GPIOA;
8093
if (pin > 15) { pin -= 16; }
94+
if (g_pinStatus[pin] == PWM_OUT) {
95+
__turnOffPWM(pin);
96+
} else if (g_pinStatus[pin] == ANALOG_INPUT) {
97+
__turnOffADC(pin);
98+
}
99+
g_pinStatus[pin] = INPUT;
81100
return HAL_GPIO_ReadPin(port, 1<<pin);
82101
}
83102

84103
void digitalToggle(uint8_t pin)
85104
{
86105
GPIO_TypeDef *port = (pin > 15)? GPIOB:GPIOA;
87106
if (pin > 15) { pin -= 16; }
107+
if (g_pinStatus[pin] == PWM_OUT) {
108+
__turnOffPWM(pin);
109+
} else if (g_pinStatus[pin] == ANALOG_INPUT) {
110+
__turnOffADC(pin);
111+
}
112+
g_pinStatus[pin] = OUTPUT_OD;
88113
HAL_GPIO_TogglePin(port, 1<<pin);
89114
}

0 commit comments

Comments
 (0)