Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F3Discovery не могу запустить таймер
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Pavel339
Имееться девайс STM32F3Discovery с родным контроллером STM32F303VCT который заменен на STM32F373VCT.

Есть проект вывод числа с плавующей точкой на дисплей WH2004A-TGK-CT#, пробывал запустить с помощью таймера, почему то не срабатывает вроде бы все делаю правильно. Потом в итоге сделал по задержкам, но мне теперь надо с АЦП работать, а там таймер нужен, который у меня не работает, может кто подскажет причину, начинающему почему не работает (код работы таймера заремен). Проект прикрепить не удалось даю ссылку на яндек диск http://yadi.sk/d/_XdJlLnw7cAH4.

Заранее спасибо. И еще работаю в Keil uVision4.
Golikov A.
таймер включили?
затактировали?
прерывания включили?
разрешили?
приоритет задали?

вы бы не проект выкладывали не пойми куда, а тут тексты функций инициализации, вызовов привели бы
Pavel339
Вот код иницилизации портов
CODE
#include "init_gpio.h"

#define SYS_CLK 48000000 // we use SPEED_HIGH = 48 MHz
#define DELAY_TIM_FREQUENCY 1000000 // 1MHZ -> timer runs in microseconds

void init_gpio(void) {
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

// Enable or disable the AHB peripheral clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

// Configure GPIO pin (ADC_IN4)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);


// Enable or disable the AHB peripheral clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);

// Configure GPIO pin
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);


GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_1
4;
GPIO_Init(GPIOD, &GPIO_InitStruct);


// Enable timer clock - use TIMER5
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// Time base configuration
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = (SYS_CLK / DELAY_TIM_FREQUENCY) - 1;
TIM_TimeBaseStructure.TIM_Period = UINT16_MAX;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

/* Enable counter */
TIM_Cmd(TIM2, ENABLE);
}

Вот подпрограмма вывода на дисплей

#include "init_gpio.h"
#include "wh2004a.h"

// void Delay_us (uint16_t uSecs) {
// uint16_t Start = (uint16_t)TIM_GetCounter(TIM2);
// while((uint16_t)((uint16_t)TIM_GetCounter(TIM2) - Start) <= uSecs);
// }

void Delay_us (uint16_t uSecs) {
volatile uint32_t Start;
Start = (uint32_t)uSecs*72;
while(Start--);
}

void wh2004_write_4_bit (char Byte, char DI) {
GPIO_ResetBits(GPIOD, GPIO_Pin_14); // E = 0
if (DI) GPIO_SetBits(GPIOD, GPIO_Pin_12); // RS = 1, Write Data
else GPIO_ResetBits(GPIOD, GPIO_Pin_12); // RS = 0, Write Instruction
GPIO_ResetBits(GPIOD, GPIO_Pin_13); // Wn/R = 0
Delay_us(2);

GPIO_SetBits(GPIOD, GPIO_Pin_14); // E = 1

GPIO_SetBits(GPIOD, ((uint16_t)Byte << 8) & 0x0F00);
GPIO_ResetBits(GPIOD, ~((uint16_t)Byte << 8) & 0x0F00);
//GPIO_Write(GPIOB, (GPIOB->ODR & 0xC3FF) | ((((uint16_t)Byte) << 10) & 0x3C00)); // Write Data
Delay_us(2);
GPIO_ResetBits(GPIOD, GPIO_Pin_14); // E = 0
Delay_us(2);
}

void wh2004_write_8_bit (char Byte, char DI) {
wh2004_write_4_bit (Byte >> 4, DI);
wh2004_write_4_bit (Byte, DI);
}

void wh2004_write_data (char Byte, char Pos) {
wh2004_write_8_bit((Pos & 0x7F) | 0x80, 0); // Set Position
Delay_us(50); // Wait 50 us
wh2004_write_8_bit(Byte, 1); // Write Data
Delay_us(50); // Wait 50 us
}

void wh2004_init () {
Delay_us(20000); // Wait 20 ms (Power On)
wh2004_write_4_bit(3, 0); // Set 4-bit mode
Delay_us(5000); // Wait 5 ms
wh2004_write_4_bit(3, 0);
Delay_us(500);

wh2004_write_4_bit(3, 0);
Delay_us(1000);
wh2004_write_4_bit(2, 0);
Delay_us(100);

wh2004_write_8_bit(0x28, 0);
Delay_us(2000); // Wait 100 us

wh2004_write_8_bit(0x0C, 0); // Display Off
Delay_us(2000); // Wait 100 us
wh2004_write_8_bit(0x01, 0); // Display Clear
Delay_us(5000); // Wait 100 us
wh2004_write_8_bit(0x06, 0); // Display Clear
Delay_us(5000); // Wait 100 us
}

Сейчас сделал на задержках функция таймера в верху программы заремлина ибо START при отладке всегда равен 0.
Golikov A.
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

GPIO - вы включили, а таймер где?
Pavel339
Точно, спасиб. А я уже всю голову сломал)))

Хотя нет тактирование включал я
// Enable timer clock - use TIMER5
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
вот
Pavel339
Заметил ошибку опечатался
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
не пойму тока почему кэйл не сриагировал на такую опечатку)
Flexz
А какая кейлу разница? Функция есть и с APB1 и с APB2, передаете вы ей int, все честно. Для контроля аргументов есть C++ и enum.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.