mirror of
https://github.com/apache/nuttx.git
synced 2026-05-23 23:28:29 +08:00
Initial STM32H5 Timers Commit
Used the STM32H7 as a reference. Removed APB enabling from stm32h5xx_rcc.c. This is done in timer initialization, like STM32H7. Also removed LPTIM. Will add later. tim_lowerhalf: Timers 9, 10, and 11 removed. Timers 15,16, and 17 added. Removed low-power timers from Kconfig. Not implemented yet. Style Updates Added stm32_tim_enable and stm32_tim_disable to Timer operations.
This commit is contained in:
committed by
Mateusz Szafoni
parent
e5e9032ea0
commit
9783c88425
+3110
-1
File diff suppressed because it is too large
Load Diff
@@ -43,7 +43,7 @@ CHIP_CSRCS += stm32_idle.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_TIMER),y)
|
||||
CHIP_CSRCS += stm32h5_tim_lowerhalf.c
|
||||
CHIP_CSRCS += stm32_tim_lowerhalf.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_STM32H5_I2C),y)
|
||||
@@ -66,6 +66,10 @@ ifeq ($(CONFIG_STM32H5_QSPI1),y)
|
||||
CHIP_CSRCS += stm32_qspi.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_STM32H5_TIM),y)
|
||||
CHIP_CSRCS += stm32_tim.c
|
||||
endif
|
||||
|
||||
# Required chip type specific files
|
||||
|
||||
ifeq ($(CONFIG_STM32H5_STM32H5XXXX),y)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,223 @@
|
||||
/****************************************************************************
|
||||
* arch/arm/src/stm32h5/stm32_tim.h
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __ARCH_ARM_SRC_STM32H5_STM32_TIM_H
|
||||
#define __ARCH_ARM_SRC_STM32H5_STM32_TIM_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include "chip.h"
|
||||
#include "hardware/stm32_tim.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* Helpers ******************************************************************/
|
||||
|
||||
#define STM32_TIM_ENABLE(d) ((d)->ops->enable(d))
|
||||
#define STM32_TIM_DISABLE(d) ((d)->ops->disable(d))
|
||||
#define STM32_TIM_SETMODE(d,mode) ((d)->ops->setmode(d,mode))
|
||||
#define STM32_TIM_SETCLOCK(d,freq) ((d)->ops->setclock(d,freq))
|
||||
#define STM32_TIM_SETPERIOD(d,period) ((d)->ops->setperiod(d,period))
|
||||
#define STM32_TIM_GETCOUNTER(d) ((d)->ops->getcounter(d))
|
||||
#define STM32_TIM_SETCOUNTER(d,c) ((d)->ops->setcounter(d,c))
|
||||
#define STM32_TIM_GETWIDTH(d) ((d)->ops->getwidth(d))
|
||||
#define STM32_TIM_SETCHANNEL(d,ch,mode) ((d)->ops->setchannel(d,ch,mode))
|
||||
#define STM32_TIM_SETCOMPARE(d,ch,comp) ((d)->ops->setcompare(d,ch,comp))
|
||||
#define STM32_TIM_GETCAPTURE(d,ch) ((d)->ops->getcapture(d,ch))
|
||||
#define STM32_TIM_SETISR(d,hnd,arg,s) ((d)->ops->setisr(d,hnd,arg,s))
|
||||
#define STM32_TIM_ENABLEINT(d,s) ((d)->ops->enableint(d,s))
|
||||
#define STM32_TIM_DISABLEINT(d,s) ((d)->ops->disableint(d,s))
|
||||
#define STM32_TIM_ACKINT(d,s) ((d)->ops->ackint(d,s))
|
||||
#define STM32_TIM_CHECKINT(d,s) ((d)->ops->checkint(d,s))
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
#define EXTERN extern "C"
|
||||
extern "C"
|
||||
{
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#endif
|
||||
|
||||
/* TIM Device Structure */
|
||||
|
||||
struct stm32_tim_dev_s
|
||||
{
|
||||
struct stm32_tim_ops_s *ops;
|
||||
};
|
||||
|
||||
/* TIM Modes of Operation */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
STM32_TIM_MODE_UNUSED = -1,
|
||||
|
||||
/* One of the following */
|
||||
|
||||
STM32_TIM_MODE_MASK = 0x0310,
|
||||
STM32_TIM_MODE_DISABLED = 0x0000,
|
||||
STM32_TIM_MODE_UP = 0x0100,
|
||||
STM32_TIM_MODE_DOWN = 0x0110,
|
||||
STM32_TIM_MODE_UPDOWN = 0x0200,
|
||||
STM32_TIM_MODE_PULSE = 0x0300,
|
||||
|
||||
/* One of the following */
|
||||
|
||||
STM32_TIM_MODE_CK_INT = 0x0000,
|
||||
#if 0
|
||||
STM32_TIM_MODE_CK_INT_TRIG = 0x0400,
|
||||
STM32_TIM_MODE_CK_EXT = 0x0800,
|
||||
STM32_TIM_MODE_CK_EXT_TRIG = 0x0c00,
|
||||
|
||||
/* Clock sources, OR'ed with CK_EXT */
|
||||
|
||||
STM32_TIM_MODE_CK_CHINVALID = 0x0000,
|
||||
STM32_TIM_MODE_CK_CH1 = 0x0001,
|
||||
STM32_TIM_MODE_CK_CH2 = 0x0002,
|
||||
STM32_TIM_MODE_CK_CH3 = 0x0003,
|
||||
STM32_TIM_MODE_CK_CH4 = 0x0004
|
||||
#endif
|
||||
|
||||
/* Todo: external trigger block */
|
||||
} stm32_tim_mode_t;
|
||||
|
||||
/* TIM Channel Modes */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
STM32_TIM_CH_DISABLED = 0x00,
|
||||
|
||||
/* Common configuration */
|
||||
|
||||
STM32_TIM_CH_POLARITY_POS = 0x00,
|
||||
STM32_TIM_CH_POLARITY_NEG = 0x01,
|
||||
|
||||
/* MODES: */
|
||||
|
||||
STM32_TIM_CH_MODE_MASK = 0x0e,
|
||||
|
||||
/* Output Compare Modes */
|
||||
|
||||
/* Enable standard PWM mode, active high when counter < compare */
|
||||
|
||||
STM32_TIM_CH_OUTPWM = 0x04,
|
||||
|
||||
/* Toggle TIM_CHx output on UEV */
|
||||
|
||||
STM32_TIM_CH_OUTTOGGLE = 0x08,
|
||||
#if 0
|
||||
STM32_TIM_CH_OUTCOMPARE = 0x06,
|
||||
|
||||
/* TODO other modes ... as PWM capture, ENCODER and Hall Sensor */
|
||||
|
||||
STM32_TIM_CH_INCAPTURE = 0x10,
|
||||
STM32_TIM_CH_INPWM = 0x20
|
||||
STM32_TIM_CH_DRIVE_OC - open collector mode
|
||||
#endif
|
||||
} stm32_tim_channel_t;
|
||||
|
||||
/* TIM Operations */
|
||||
|
||||
struct stm32_tim_ops_s
|
||||
{
|
||||
/* Basic Timers */
|
||||
|
||||
void (*enable)(struct stm32_tim_dev_s *dev);
|
||||
void (*disable)(struct stm32_tim_dev_s *dev);
|
||||
int (*setmode)(struct stm32_tim_dev_s *dev, stm32_tim_mode_t mode);
|
||||
int (*setclock)(struct stm32_tim_dev_s *dev, uint32_t freq);
|
||||
void (*setperiod)(struct stm32_tim_dev_s *dev, uint32_t period);
|
||||
uint32_t (*getcounter)(struct stm32_tim_dev_s *dev);
|
||||
void (*setcounter)(struct stm32_tim_dev_s *dev, uint32_t count);
|
||||
|
||||
/* General and Advanced Timers Adds */
|
||||
|
||||
int (*getwidth)(struct stm32_tim_dev_s *dev);
|
||||
int (*setchannel)(struct stm32_tim_dev_s *dev, uint8_t channel,
|
||||
stm32_tim_channel_t mode);
|
||||
int (*setcompare)(struct stm32_tim_dev_s *dev, uint8_t channel,
|
||||
uint32_t compare);
|
||||
int (*getcapture)(struct stm32_tim_dev_s *dev, uint8_t channel);
|
||||
|
||||
/* Timer interrupts */
|
||||
|
||||
int (*setisr)(struct stm32_tim_dev_s *dev, xcpt_t handler, void *arg,
|
||||
int source);
|
||||
void (*enableint)(struct stm32_tim_dev_s *dev, int source);
|
||||
void (*disableint)(struct stm32_tim_dev_s *dev, int source);
|
||||
void (*ackint)(struct stm32_tim_dev_s *dev, int source);
|
||||
int (*checkint)(struct stm32_tim_dev_s *dev, int source);
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Power-up timer and get its structure */
|
||||
|
||||
struct stm32_tim_dev_s *stm32_tim_init(int timer);
|
||||
|
||||
/* Power-down timer, mark it as unused */
|
||||
|
||||
int stm32_tim_deinit(struct stm32_tim_dev_s *dev);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: stm32_timer_initialize
|
||||
*
|
||||
* Description:
|
||||
* Bind the configuration timer to a timer lower half instance and
|
||||
* register the timer drivers at 'devpath'
|
||||
*
|
||||
* Input Parameters:
|
||||
* devpath - The full path to the timer device. This should be of the
|
||||
* form /dev/timer0
|
||||
* timer - the timer number.
|
||||
*
|
||||
* Returned Values:
|
||||
* Zero (OK) is returned on success; A negated errno value is returned
|
||||
* to indicate the nature of any failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_TIMER
|
||||
int stm32_timer_initialize(const char *devpath, int timer);
|
||||
#endif
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ARCH_ARM_SRC_STM32H5_STM32_TIM_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -355,60 +355,6 @@ static inline void rcc_enableapb1l(void)
|
||||
|
||||
regval = getreg32(STM32_RCC_APB1LENR);
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM2
|
||||
/* Bit 0: TIM2 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM2EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM3
|
||||
/* Bit 1: TIM3 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM3EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM4
|
||||
/* Bit 2: TIM4 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM4EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM5
|
||||
/* Bit 3: TIM5 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM5EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM6
|
||||
/* Bit 4: TIM6 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM6EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM7
|
||||
/* Bit 5: TIM7 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM7EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM12
|
||||
/* Bit 5: TIM12 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM12EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM13
|
||||
/* Bit 5: TIM13 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM13EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM14
|
||||
/* Bit 5: TIM14 clock enable */
|
||||
|
||||
regval |= RCC_APB1LENR_TIM14EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_SPI2
|
||||
/* Bit 14: SPI2 clock enable */
|
||||
|
||||
@@ -588,48 +534,18 @@ static inline void rcc_enableapb2(void)
|
||||
|
||||
regval = getreg32(STM32_RCC_APB2ENR);
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM1
|
||||
/* TIM1 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_TIM1EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_SPI1
|
||||
/* SPI1 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_SPI1EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM8
|
||||
/* TIM8 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_TIM8EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_USART1
|
||||
/* USART1 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_USART1EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM15
|
||||
/* TIM15 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_TIM15EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM16
|
||||
/* TIM16 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_TIM16EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_TIM17
|
||||
/* TIM17 clock enable */
|
||||
|
||||
regval |= RCC_APB2ENR_TIM17EN;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_STM32H5_SPI4
|
||||
/* SPI4 clock enable */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user