mirror of https://github.com/ARMmbed/mbed-os.git
[NUCLEO_F103RB] Code cleanup, correction in pins definition
parent
7d145c8dc4
commit
bef6fdf339
|
@ -102,8 +102,9 @@ typedef enum {
|
||||||
PC_14 = 0x2E,
|
PC_14 = 0x2E,
|
||||||
PC_15 = 0x2F,
|
PC_15 = 0x2F,
|
||||||
|
|
||||||
|
PD_0 = 0x30,
|
||||||
|
PD_1 = 0x31,
|
||||||
PD_2 = 0x32,
|
PD_2 = 0x32,
|
||||||
PD_8 = 0x38,
|
|
||||||
|
|
||||||
// Arduino connector namings
|
// Arduino connector namings
|
||||||
A0 = PA_0,
|
A0 = PA_0,
|
||||||
|
|
|
@ -29,6 +29,19 @@
|
||||||
#include "us_ticker_api.h"
|
#include "us_ticker_api.h"
|
||||||
#include "PeripheralNames.h"
|
#include "PeripheralNames.h"
|
||||||
|
|
||||||
|
// Timers selection:
|
||||||
|
// The Master timer clocks the Slave timer
|
||||||
|
|
||||||
|
#define TIM_MST TIM1
|
||||||
|
#define TIM_MST_IRQ TIM1_CC_IRQn
|
||||||
|
#define TIM_MST_RCC RCC_APB2Periph_TIM1
|
||||||
|
|
||||||
|
#define TIM_SLV TIM4
|
||||||
|
#define TIM_SLV_IRQ TIM4_IRQn
|
||||||
|
#define TIM_SLV_RCC RCC_APB1Periph_TIM4
|
||||||
|
|
||||||
|
#define MST_SLV_ITR TIM_TS_ITR0
|
||||||
|
|
||||||
int us_ticker_inited = 0;
|
int us_ticker_inited = 0;
|
||||||
|
|
||||||
void us_ticker_init(void) {
|
void us_ticker_init(void) {
|
||||||
|
@ -40,19 +53,18 @@ void us_ticker_init(void) {
|
||||||
us_ticker_inited = 1;
|
us_ticker_inited = 1;
|
||||||
|
|
||||||
// Enable Timers clock
|
// Enable Timers clock
|
||||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
|
RCC_APB2PeriphClockCmd(TIM_MST_RCC, ENABLE);
|
||||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
|
RCC_APB1PeriphClockCmd(TIM_SLV_RCC, ENABLE);
|
||||||
|
|
||||||
// Time base configuration
|
// Master and Slave timers time base configuration
|
||||||
// TIM1 is used as "master", "TIM4" as "slave". TIM4 is clocked by TIM1.
|
|
||||||
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
|
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
|
||||||
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
|
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
|
||||||
TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
|
TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
|
||||||
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
|
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
|
||||||
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
||||||
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
|
TIM_TimeBaseInit(TIM_MST, &TIM_TimeBaseStructure);
|
||||||
TIM_TimeBaseStructure.TIM_Prescaler = 0;
|
TIM_TimeBaseStructure.TIM_Prescaler = 0;
|
||||||
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
|
TIM_TimeBaseInit(TIM_SLV, &TIM_TimeBaseStructure);
|
||||||
|
|
||||||
// Master timer configuration
|
// Master timer configuration
|
||||||
TIM_OCStructInit(&TIM_OCInitStructure);
|
TIM_OCStructInit(&TIM_OCInitStructure);
|
||||||
|
@ -60,32 +72,34 @@ void us_ticker_init(void) {
|
||||||
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
||||||
TIM_OCInitStructure.TIM_Pulse = 0;
|
TIM_OCInitStructure.TIM_Pulse = 0;
|
||||||
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
|
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
|
||||||
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
|
TIM_OC1Init(TIM_MST, &TIM_OCInitStructure);
|
||||||
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
|
TIM_SelectMasterSlaveMode(TIM_MST, TIM_MasterSlaveMode_Enable);
|
||||||
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
|
TIM_SelectOutputTrigger(TIM_MST, TIM_TRGOSource_Update);
|
||||||
|
|
||||||
// Slave timer configuration
|
// Slave timer configuration
|
||||||
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_External1);
|
TIM_SelectSlaveMode(TIM_SLV, TIM_SlaveMode_External1);
|
||||||
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR0);
|
// The connection between Master and Slave is done here
|
||||||
|
TIM_SelectInputTrigger(TIM_SLV, MST_SLV_ITR);
|
||||||
|
|
||||||
// Enable timers
|
// Enable timers
|
||||||
TIM_Cmd(TIM4, ENABLE);
|
TIM_Cmd(TIM_SLV, ENABLE);
|
||||||
TIM_Cmd(TIM1, ENABLE);
|
TIM_Cmd(TIM_MST, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t us_ticker_read() {
|
uint32_t us_ticker_read() {
|
||||||
uint32_t counter, counter2;
|
uint32_t counter, counter2;
|
||||||
if (!us_ticker_inited) us_ticker_init();
|
if (!us_ticker_inited) us_ticker_init();
|
||||||
// A situation might appear when TIM1 overflows right after TIM4 is read and before the
|
// A situation might appear when Master overflows right after Slave is read and before the
|
||||||
// new (overflowed) value of TIM1 is read, which would make the code below consider the
|
// new (overflowed) value of Master is read. Which would make the code below consider the
|
||||||
// previous (incorrect) value of TIM4 and the new value of TIM1, which would return a
|
// previous (incorrect) value of Slave and the new value of Master, which would return a
|
||||||
// value in the past. Avoid this by computing consecutive values of the timer until they
|
// value in the past. Avoid this by computing consecutive values of the timer until they
|
||||||
// are properly ordered.
|
// are properly ordered.
|
||||||
counter = counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM4) << 16) + (uint32_t)TIM_GetCounter(TIM1);
|
counter = counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM_SLV) << 16) + (uint32_t)TIM_GetCounter(TIM_MST);
|
||||||
while (1) {
|
while (1) {
|
||||||
counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM4) << 16) + (uint32_t)TIM_GetCounter(TIM1);
|
counter2 = (uint32_t)((uint32_t)TIM_GetCounter(TIM_SLV) << 16) + (uint32_t)TIM_GetCounter(TIM_MST);
|
||||||
if (counter2 > counter)
|
if (counter2 > counter) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
counter = counter2;
|
counter = counter2;
|
||||||
}
|
}
|
||||||
return counter2;
|
return counter2;
|
||||||
|
@ -93,25 +107,25 @@ uint32_t us_ticker_read() {
|
||||||
|
|
||||||
void us_ticker_set_interrupt(unsigned int timestamp) {
|
void us_ticker_set_interrupt(unsigned int timestamp) {
|
||||||
if (timestamp > 0xFFFF) {
|
if (timestamp > 0xFFFF) {
|
||||||
TIM_SetCompare1(TIM4, (uint16_t)((timestamp >> 16) & 0xFFFF));
|
TIM_SetCompare1(TIM_SLV, (uint16_t)((timestamp >> 16) & 0xFFFF));
|
||||||
TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE);
|
TIM_ITConfig(TIM_SLV, TIM_IT_CC1, ENABLE);
|
||||||
NVIC_SetVector(TIM4_IRQn, (uint32_t)us_ticker_irq_handler);
|
NVIC_SetVector(TIM_SLV_IRQ, (uint32_t)us_ticker_irq_handler);
|
||||||
NVIC_EnableIRQ(TIM4_IRQn);
|
NVIC_EnableIRQ(TIM_SLV_IRQ);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
TIM_SetCompare1(TIM1, (uint16_t)timestamp);
|
TIM_SetCompare1(TIM_MST, (uint16_t)timestamp);
|
||||||
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
|
TIM_ITConfig(TIM_MST, TIM_IT_CC1, ENABLE);
|
||||||
NVIC_SetVector(TIM1_CC_IRQn, (uint32_t)us_ticker_irq_handler);
|
NVIC_SetVector(TIM_MST_IRQ, (uint32_t)us_ticker_irq_handler);
|
||||||
NVIC_EnableIRQ(TIM1_CC_IRQn);
|
NVIC_EnableIRQ(TIM_MST_IRQ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_disable_interrupt(void) {
|
void us_ticker_disable_interrupt(void) {
|
||||||
TIM_ITConfig(TIM1, TIM_IT_CC1, DISABLE);
|
TIM_ITConfig(TIM_MST, TIM_IT_CC1, DISABLE);
|
||||||
TIM_ITConfig(TIM4, TIM_IT_CC1, DISABLE);
|
TIM_ITConfig(TIM_SLV, TIM_IT_CC1, DISABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_clear_interrupt(void) {
|
void us_ticker_clear_interrupt(void) {
|
||||||
TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);
|
TIM_ClearITPendingBit(TIM_MST, TIM_IT_CC1);
|
||||||
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
|
TIM_ClearITPendingBit(TIM_SLV, TIM_IT_CC1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue