mi mi
/
FastPWM-DISCO-test
FastPWM test program.
main.cpp@1:3ac9dab9a2cc, 2016-02-11 (annotated)
- Committer:
- mimi3
- Date:
- Thu Feb 11 03:17:54 2016 +0000
- Revision:
- 1:3ac9dab9a2cc
- Parent:
- 0:e4a1dd15fa04
Mod: only comment.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mimi3 | 0:e4a1dd15fa04 | 1 | #include "mbed.h" |
mimi3 | 0:e4a1dd15fa04 | 2 | #include "FastPWM.h" |
mimi3 | 0:e4a1dd15fa04 | 3 | |
mimi3 | 1:3ac9dab9a2cc | 4 | /* Those targets have been tested by this test program. |
mimi3 | 0:e4a1dd15fa04 | 5 | * DISCO_F051R8 |
mimi3 | 0:e4a1dd15fa04 | 6 | * DISCO_F100RB |
mimi3 | 0:e4a1dd15fa04 | 7 | * DISCO_F303VC |
mimi3 | 0:e4a1dd15fa04 | 8 | * DISCO_F407VG |
mimi3 | 0:e4a1dd15fa04 | 9 | * NUCLEO_F030R8 |
mimi3 | 0:e4a1dd15fa04 | 10 | * NUCLEO_L152RE |
mimi3 | 0:e4a1dd15fa04 | 11 | * NUCLEO_F411RE |
mimi3 | 1:3ac9dab9a2cc | 12 | * |
mimi3 | 1:3ac9dab9a2cc | 13 | * with mbed library rev.113. |
mimi3 | 0:e4a1dd15fa04 | 14 | */ |
mimi3 | 0:e4a1dd15fa04 | 15 | |
mimi3 | 0:e4a1dd15fa04 | 16 | /* Period Interrupt monitor */ |
mimi3 | 0:e4a1dd15fa04 | 17 | DigitalOut led(LED1); |
mimi3 | 0:e4a1dd15fa04 | 18 | |
mimi3 | 0:e4a1dd15fa04 | 19 | /* Using FastPWM library from: |
mimi3 | 0:e4a1dd15fa04 | 20 | * http://developer.mbed.org/users/Sissors/code/FastPWM/ |
mimi3 | 0:e4a1dd15fa04 | 21 | * Thank you this library. |
mimi3 | 0:e4a1dd15fa04 | 22 | */ |
mimi3 | 0:e4a1dd15fa04 | 23 | #define TPWM FastPWM |
mimi3 | 0:e4a1dd15fa04 | 24 | |
mimi3 | 0:e4a1dd15fa04 | 25 | #if defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F401RE) \ |
mimi3 | 0:e4a1dd15fa04 | 26 | || defined(TARGET_DISCO_F303VC) || defined(TARGET_DISCO_F407VG) |
mimi3 | 0:e4a1dd15fa04 | 27 | TPWM pwm_left( PA_8,1); |
mimi3 | 0:e4a1dd15fa04 | 28 | #if defined(TARGET_DISCO_F407VG) |
mimi3 | 0:e4a1dd15fa04 | 29 | TPWM pwm_right(PA_10,1); |
mimi3 | 0:e4a1dd15fa04 | 30 | #else |
mimi3 | 0:e4a1dd15fa04 | 31 | TPWM pwm_right(PA_9,1); |
mimi3 | 0:e4a1dd15fa04 | 32 | #endif |
mimi3 | 0:e4a1dd15fa04 | 33 | /* Interrupt */ |
mimi3 | 0:e4a1dd15fa04 | 34 | #define TIM_PWM TIM1 |
mimi3 | 0:e4a1dd15fa04 | 35 | #if defined(TARGET_DISCO_F303VC) |
mimi3 | 0:e4a1dd15fa04 | 36 | #define TIM_PWM_IRQ TIM1_UP_TIM16_IRQn |
mimi3 | 0:e4a1dd15fa04 | 37 | #else |
mimi3 | 0:e4a1dd15fa04 | 38 | #define TIM_PWM_IRQ TIM1_UP_TIM10_IRQn |
mimi3 | 0:e4a1dd15fa04 | 39 | #endif |
mimi3 | 0:e4a1dd15fa04 | 40 | #elif defined(TARGET_STM32F030R8) || defined(TARGET_STM32F051R8) \ |
mimi3 | 0:e4a1dd15fa04 | 41 | || defined(TARGET_STM32F100RB) || defined(TARGET_STM32L152RE) |
mimi3 | 0:e4a1dd15fa04 | 42 | /* PWM3-1 D12 PA_6 Audio out Left |
mimi3 | 0:e4a1dd15fa04 | 43 | PWM3-2 D11 PA_7 Audio out Right */ |
mimi3 | 0:e4a1dd15fa04 | 44 | TPWM pwm_left( PA_6,1); |
mimi3 | 0:e4a1dd15fa04 | 45 | TPWM pwm_right(PA_7,1); |
mimi3 | 0:e4a1dd15fa04 | 46 | /* Interrupt */ |
mimi3 | 0:e4a1dd15fa04 | 47 | #define TIM_PWM TIM3 |
mimi3 | 0:e4a1dd15fa04 | 48 | #define TIM_PWM_IRQ TIM3_IRQn |
mimi3 | 0:e4a1dd15fa04 | 49 | #endif |
mimi3 | 0:e4a1dd15fa04 | 50 | |
mimi3 | 0:e4a1dd15fa04 | 51 | /* PWM Timer constant value */ |
mimi3 | 0:e4a1dd15fa04 | 52 | #define F_CLK_ABP1 (SystemCoreClock) // |
mimi3 | 0:e4a1dd15fa04 | 53 | #define TIMER_INPUT_CLK F_CLK_ABP1 |
mimi3 | 0:e4a1dd15fa04 | 54 | #define MAX_PERIOD ( TIMER_INPUT_CLK / (44100) ) // fs=44.1kHz |
mimi3 | 0:e4a1dd15fa04 | 55 | #define MAX_DUTY ( (int32_t)MAX_PERIOD ) // Audio resolution : |
mimi3 | 0:e4a1dd15fa04 | 56 | #define DELAY_MS 2 |
mimi3 | 0:e4a1dd15fa04 | 57 | |
mimi3 | 0:e4a1dd15fa04 | 58 | static TIM_HandleTypeDef TimHandle; |
mimi3 | 0:e4a1dd15fa04 | 59 | |
mimi3 | 0:e4a1dd15fa04 | 60 | /* PWM Timer Interrupt routine */ |
mimi3 | 0:e4a1dd15fa04 | 61 | void IntrPwmPeriod( void ){ |
mimi3 | 0:e4a1dd15fa04 | 62 | HAL_TIM_IRQHandler( &TimHandle ); |
mimi3 | 0:e4a1dd15fa04 | 63 | } |
mimi3 | 0:e4a1dd15fa04 | 64 | |
mimi3 | 0:e4a1dd15fa04 | 65 | /* HAL callback for PWM Timer Interrupt |
mimi3 | 0:e4a1dd15fa04 | 66 | * Test monitor |
mimi3 | 0:e4a1dd15fa04 | 67 | * */ |
mimi3 | 0:e4a1dd15fa04 | 68 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ |
mimi3 | 0:e4a1dd15fa04 | 69 | (void)htim; |
mimi3 | 0:e4a1dd15fa04 | 70 | led = 1; |
mimi3 | 0:e4a1dd15fa04 | 71 | led = 0; |
mimi3 | 0:e4a1dd15fa04 | 72 | } |
mimi3 | 0:e4a1dd15fa04 | 73 | |
mimi3 | 0:e4a1dd15fa04 | 74 | int main() { |
mimi3 | 0:e4a1dd15fa04 | 75 | |
mimi3 | 0:e4a1dd15fa04 | 76 | TimHandle.Instance = TIM_PWM; |
mimi3 | 0:e4a1dd15fa04 | 77 | |
mimi3 | 0:e4a1dd15fa04 | 78 | int i =1, delta = 1; |
mimi3 | 0:e4a1dd15fa04 | 79 | |
mimi3 | 0:e4a1dd15fa04 | 80 | NVIC_SetVector( TIM_PWM_IRQ, (uint32_t)&IntrPwmPeriod ); |
mimi3 | 0:e4a1dd15fa04 | 81 | |
mimi3 | 0:e4a1dd15fa04 | 82 | pwm_left.period_ticks( MAX_PERIOD ); |
mimi3 | 0:e4a1dd15fa04 | 83 | pwm_right.period_ticks( MAX_PERIOD ); |
mimi3 | 0:e4a1dd15fa04 | 84 | |
mimi3 | 0:e4a1dd15fa04 | 85 | NVIC_EnableIRQ( TIM_PWM_IRQ ); |
mimi3 | 0:e4a1dd15fa04 | 86 | __HAL_TIM_ENABLE_IT( &TimHandle, TIM_IT_UPDATE ); |
mimi3 | 0:e4a1dd15fa04 | 87 | |
mimi3 | 0:e4a1dd15fa04 | 88 | while(1) { |
mimi3 | 0:e4a1dd15fa04 | 89 | pwm_left.pulsewidth_ticks( i ); |
mimi3 | 0:e4a1dd15fa04 | 90 | pwm_right.pulsewidth_ticks( i/2 ); |
mimi3 | 0:e4a1dd15fa04 | 91 | if( ( i > MAX_DUTY-1 ) || ( i <= 0 ) ){ |
mimi3 | 0:e4a1dd15fa04 | 92 | delta *= -1; |
mimi3 | 0:e4a1dd15fa04 | 93 | } |
mimi3 | 0:e4a1dd15fa04 | 94 | i += delta; |
mimi3 | 0:e4a1dd15fa04 | 95 | |
mimi3 | 0:e4a1dd15fa04 | 96 | wait_ms( DELAY_MS ); |
mimi3 | 0:e4a1dd15fa04 | 97 | } |
mimi3 | 0:e4a1dd15fa04 | 98 | } |
mimi3 | 0:e4a1dd15fa04 | 99 | |
mimi3 | 0:e4a1dd15fa04 | 100 | |
mimi3 | 0:e4a1dd15fa04 | 101 |