我仿照一个编码器程序改。
源程序为:
`
#include “main.h”
#include “Board.h”
/* Private includes *******************************************************/
/* Private macro **********************************************************/
/* printf function configs to USART2*/
#define DEBUG_USART USART2
#define DIV 167
/* Private typedef ********************************************************/
/* Private variables ******************************************************/
uint16_t encoderNum = 0;
volatile uint32_t tick = 0;
/* Private function prototypes ********************************************/
/* External variables *****************************************************/
/* External functions *****************************************************/
/*!
@brief Main program
*
@param None
*
@retval None
*/
int main(void)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfig;
TMR_BaseConfig_T baseConfig;
TMR_ICConfig_T ICConfig;
BOARD_LEDInit(LED2);
BOARD_LEDOff(LED2);
/* USART2 Tx PA2 Rx PA3 */
usartConfig.baudRate = 115200;
usartConfig.mode = USART_MODE_TX_RX;
usartConfig.hardwareFlow = USART_HARDWARE_FLOW_NONE;
usartConfig.parity = USART_PARITY_NONE;
usartConfig.stopBits = USART_STOP_BIT_1;
usartConfig.wordLength = USART_WORD_LEN_8B;
BOARD_COMInit(COM2,&usartConfig);
/* Enable GPIOA Periph Clock */
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
/* Config GPIO */
gpioConfig.pin = GPIO_PIN_8 | GPIO_PIN_9;
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.speed = GPIO_SPEED_100MHz;
gpioConfig.otype = GPIO_OTYPE_OD;
gpioConfig.pupd = GPIO_PUPD_UP;
GPIO_Config(GPIOA,&gpioConfig);
/* Config GPIOA Alernate Function for TMR1 */
GPIO_ConfigPinAF(GPIOA,GPIO_PIN_SOURCE_8,GPIO_AF_TMR1);
GPIO_ConfigPinAF(GPIOA,GPIO_PIN_SOURCE_9,GPIO_AF_TMR1);
/* Enable TMR1,TMR2 Periph Clock */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1);
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2);
/* Config TMR1 */
baseConfig.clockDivision = TMR_CLOCK_DIV_1;
baseConfig.countMode = TMR_COUNTER_MODE_UP;
baseConfig.division = DIV;
baseConfig.period = 0×0008;
baseConfig.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR1, &baseConfig);
/* Config TMR2 */
baseConfig.clockDivision = TMR_CLOCK_DIV_1;
baseConfig.countMode = TMR_COUNTER_MODE_UP;
baseConfig.division = DIV;
baseConfig.period = 999;
baseConfig.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR2, &baseConfig);
/* Encoder */
TMR_ConfigEncodeInterface(TMR1,TMR_ENCODER_MODE_TI1,TMR_IC_POLARITY_RISING,TMR_IC_POLARITY_RISING);
/* Input Capture */
ICConfig.channel = TMR_CHANNEL_1;
ICConfig.polarity = TMR_IC_POLARITY_RISING;
ICConfig.selection = TMR_IC_SELECTION_DIRECT_TI;
ICConfig.prescaler = TMR_IC_PSC_1;
ICConfig.filter = 0;
TMR_ConfigIC(TMR1,&ICConfig);
ICConfig.channel = TMR_CHANNEL_2;
TMR_ConfigIC(TMR1,&ICConfig);
/* Counter */
TMR_ConfigCounter(TMR1,0×0004);
TMR_ClearStatusFlag(TMR1,TMR_FLAG_UPDATE);
TMR_ClearStatusFlag(TMR2,TMR_FLAG_UPDATE);
/* Enable TMR1,TMR2 Interrupt */
TMR_EnableInterrupt(TMR1, TMR_INT_UPDATE);
TMR_EnableInterrupt(TMR2, TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR1_UP_TMR10_IRQn, 0, 0);
NVIC_EnableIRQRequest(TMR2_IRQn, 0, 0);
/* Enable TMR1,TMR2 */
TMR_Enable(TMR1);
TMR_Enable(TMR2);
while(1)
{
BOARD_LEDToggle(LED2);
Delay();
}
}`
我用的TMR4,PD12,PD13,
程序大约改成这样:
`
#include “main.h”
#include “Board.h”
/* Private includes *******************************************************/
/* Private macro **********************************************************/
/* printf function configs to USART2*/
#define DEBUG_USART USART2
#define DIV 167
/* Private typedef ********************************************************/
/* Private variables ******************************************************/
uint16_t encoderNum = 0;
volatile uint32_t tick = 0;
/* Private function prototypes ********************************************/
/* External variables *****************************************************/
/* External functions *****************************************************/
/*!
@brief Main program
*
@param None
*
@retval None
*/
int main(void)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfig;
TMR_BaseConfig_T baseConfig;
TMR_ICConfig_T ICConfig;
BOARD_LEDInit(LED2);
BOARD_LEDOff(LED2);
/* USART2 Tx PA2 Rx PA3 */
// usartConfig.baudRate = 115200;
// usartConfig.mode = USART_MODE_TX_RX;
// usartConfig.hardwareFlow = USART_HARDWARE_FLOW_NONE;
// usartConfig.parity = USART_PARITY_NONE;
// usartConfig.stopBits = USART_STOP_BIT_1;
// usartConfig.wordLength = USART_WORD_LEN_8B;
// BOARD_COMInit(COM2,&usartConfig);
/* Enable GPIOA Periph Clock */
RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
/* Config GPIO */
gpioConfig.pin = GPIO_PIN_12 | GPIO_PIN_13;
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.speed = GPIO_SPEED_100MHz;
gpioConfig.otype = GPIO_OTYPE_OD;
gpioConfig.pupd = GPIO_PUPD_UP;
GPIO_Config(GPIOD,&gpioConfig);
/* Config GPIOA Alernate Function for TMR1 */
GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_12,GPIO_AF_TMR4);
GPIO_ConfigPinAF(GPIOD,GPIO_PIN_SOURCE_13,GPIO_AF_TMR4);
/* Enable TMR1,TMR2 Periph Clock */
RCM_EnableAPB2PeriphClock(RCM_APB1_PERIPH_TMR4);
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2);
/* Config TMR1 */
baseConfig.clockDivision = TMR_CLOCK_DIV_1;
baseConfig.countMode = TMR_COUNTER_MODE_UP;
baseConfig.division = DIV;
baseConfig.period = 0×0008;
baseConfig.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR4, &baseConfig);
/* Config TMR2 */
baseConfig.clockDivision = TMR_CLOCK_DIV_1;
baseConfig.countMode = TMR_COUNTER_MODE_UP;
baseConfig.division = DIV;
baseConfig.period = 999;
baseConfig.repetitionCounter = 0;
TMR_ConfigTimeBase(TMR2, &baseConfig);
/* Encoder */
TMR_ConfigEncodeInterface(TMR4,TMR_ENCODER_MODE_TI1,TMR_IC_POLARITY_RISING,TMR_IC_POLARITY_RISING);
/* Input Capture */
ICConfig.channel = TMR_CHANNEL_1;
ICConfig.polarity = TMR_IC_POLARITY_RISING;
ICConfig.selection = TMR_IC_SELECTION_DIRECT_TI;
ICConfig.prescaler = TMR_IC_PSC_1;
ICConfig.filter = 0;
TMR_ConfigIC(TMR4,&ICConfig);
ICConfig.channel = TMR_CHANNEL_2;
TMR_ConfigIC(TMR4,&ICConfig);
/* Counter */
TMR_ConfigCounter(TMR4,0×0004);
TMR_ClearStatusFlag(TMR4,TMR_FLAG_UPDATE);
TMR_ClearStatusFlag(TMR2,TMR_FLAG_UPDATE);
/* Enable TMR1,TMR2 Interrupt */
TMR_EnableInterrupt(TMR4, TMR_INT_UPDATE);
TMR_EnableInterrupt(TMR2, TMR_INT_UPDATE);
NVIC_EnableIRQRequest(TMR1_UP_TMR10_IRQn, 0, 0);
NVIC_EnableIRQRequest(TMR2_IRQn, 0, 0);
/* Enable TMR1,TMR2 */
TMR_Enable(TMR4);
TMR_Enable(TMR2);
while(1)
{
BOARD_LEDToggle(LED2);
Delay();
}
}`
其中这一句我不知道该怎么改NVIC_EnableIRQRequest(TMR1_UP_TMR10_IRQn, 0, 0);
请问高手如何解决?谢谢