Jump to content

    
Sign in to follow this  
shev

stm32f100 Проблемы с настройкой DAC в RCC

Recommended Posts

Имеется плата с контроллером stm32f100c8, отладчик ULINK 2.

Код для настройки Reset and clock control (RCC) следующий:

/******************* Clock Init ***********************/

void ClockInit(void){

RCC->CR = RCC_CR_HSION; /* Enable HSI */

while(!(RCC->CR & RCC_CR_HSIRDY)); /* Wait till HSI is ready */

 

RCC->APB2ENR = (RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN |

RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_ADC1EN | RCC_APB2ENR_TIM1EN);

RCC->APB1ENR = (RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM4EN |

RCC_APB1ENR_SPI2EN | RCC_APB1ENR_TIM6EN | RCC_APB1ENR_TIM7EN | RCC_APB1ENR_DACEN);

}/******************* Clock Init ***********************/

Устанавливаются все биты кроме, тех что отвечают за DAC и TIM6,TIM7.

Контроллер работает, АЦП, таймеры, GPIO,

НО ЦАП не работает!!!

Обращение к его регистрам типа

/void DACInit(void){

DAC->CR = DAC_CR_TEN1 ;

DAC->CR |= 0x7<<TSEL1_pos;

DAC->CR |= DAC_CR_EN1;

 

DAC->DHR12R1 = 0xfff/2; //for data

DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1;

}/******************* DAC initialization ***********************/

ни к чему не приводит. Все регистры равны нулю.

Да впрочем это и логично, если бит DACEN(№29) в регистре RCC_APB1ENR равен 0.

Но почему он не устанавливается???

 

Кто нибудь работал с ЦАПом с stm32f100 ?

Помогите советом.

Share this post


Link to post
Share on other sites
Да впрочем это и логично, если бит DACEN(№29) в регистре RCC_APB1ENR равен 0.

Но почему он не устанавливается???

 

Кто нибудь работал с ЦАПом с stm32f100 ?

Помогите советом.

У меня ЦАП в STM32F100C4 работает. Чужие библиотеки не очень люблю, поэтому мой код инициализации выглядит так (лишнее убрано):

#define REG32(addr)     (*(uint32_t volatile*)(addr))
#define PERIPH_BASE     0x40000000
#define REGBIT(reg,bit) REG32(PERIPH_BASE+0x2000000+((uint32_t)&(reg)-PERIPH_BASE)*32+(bit)*4)
#define RCC_BASE        (PERIPH_BASE + 0x21000)
#define RCC_APB1ENR     REG32(RCC_BASE + 0x1C)
#define DAC_BASE        (PERIPH_BASE + 0x7400)
#define DAC_CR          REG32(DAC_BASE + 0)
#define GPIOA_BASE      (PERIPH_BASE + 0x10800)
#define GPIOA_CRL       REG32(GPIOA_BASE + 0)

REGBIT(RCC_APB1ENR, 29) = 1; /* enable clocking of DAC */
DAC_CR = 1 << 16; /* DAC2 enable */
GPIOA_CRL = GPIOA_CRL & 0xFF0FFFFF; /* PA5 is AIN (DAC output) */

Share this post


Link to post
Share on other sites

Попробовал у себя - не работает :(

Пара вопросов:

Запускаете через отладчик ULINK 2 или через USART ?

Какая ревизия микросхемы (в правом нижнем углу на корпусе)?

Дело в том что на сайте st.com есть errata на rev. Z, а у меня rev. Y.

Может здесь проблема...?

Share this post


Link to post
Share on other sites
Запускаете через отладчик ULINK 2 или через USART ?

Какая ревизия микросхемы (в правом нижнем углу на корпусе)?

Дело в том что на сайте st.com есть errata на rev. Z, а у меня rev. Y.

Может здесь проблема...?

Запускаю через ST-LINK, но это сути не меняет, так как всё работает и под отладчиком, и в боевом режиме.

Ревизию посмотрю чуть позже, но сомневаюсь, что дело в этом.

Может быть, у Вас STM32F101? Это почти такой же микроконтроллер, только ЦАПа там нет.

Я бы потщательнее поотлаживал. К примеру, в тестирующей программе делал бы запись регистров и их чтение (для контроля). Причём считанные значения сохранял бы в volatile-массиве и отладчиком смотрел именно содержимое массива, чтобы не зависеть от работы отладчика с регистрами. Нужно убедиться, что сброшен бит DACRST в RCC_APB1RSTR, установлен бит DACEN в RCC_APB1ENR, установлен бит EN1 или EN2 в DAC_CR, PA4 или PA5 сконфигурированы как Analog Input. Также следует проверить, что не превышены максимально допустимые тактовые частоты. Также проверить, не могут ли мешать обработчики прерываний, сторожевые таймеры и прочее.

Share this post


Link to post
Share on other sites

Всё это уже пробовал.

Не устанавливается бит DACEN в RCC_APB1ENR - дальше можно и не смотреть.

А это по сути - одна строчка (из вашего примера)...

Интересно, что бит DACRST в RCC_APB1RSTR также не устанавливается.

Я уже всё лишнее выкинул, от HSI без PLL работаю - всё по дефолту.

Может контроллер левый... Хотя на вид очень даже красивый с маркировкой ST:

STM32

F100C8T6

9907N 93

MYS 947

ST e4 Y

Share this post


Link to post
Share on other sites

У меня маркировка такая:

STM32F100

C4T6B

990H1 93

MYS 018

ST e4 Z

 

Не устанавливается бит DACEN в RCC_APB1ENR - дальше можно и не смотреть.

А это по сути - одна строчка (из вашего примера)...

Интересно, что бит DACRST в RCC_APB1RSTR также не устанавливается.

 

А вот это интересно. Если биты DACEN и DACRST не устанавливаются, то логично предположить, что ЦАПа там нет. Про ревизию Y на сайте ST - молчок. Может быть, в этой ревизии ЦАПа не было?

Share this post


Link to post
Share on other sites

Вопрос решился следующим образом. Ответ техподдержки:

 

if you confirm that there is no B at the end of the product reference, then it is normal that the DAC is not working, as it is not present in the chip.

 

The real and final Value-Line products are the F100 with a B at the end, e.g. STM32F100C8T6B.

 

Before that these version was available, a preliminary version based on the F101 Access-Line was released as intermediary version (no B at the end), it does not include the DAC for example, and less timers. I assume this the rootcause.

 

Так что кому нужен ЦАП в stm32f100, берите с буквой B.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this