Страница 5 из 11

Re: Про Keil uVision 5

Добавлено: Ср июл 16, 2014 15:49:27
baghear
Почему не так?
*(uint16_t ) (LCD_REG) = reg;

Re: Про Keil uVision 5

Добавлено: Ср июл 16, 2014 16:13:55
menzoda
Потому что тогда (uint16_t)(LCD_REG) превратит значение адреса в двухбайтное целое число. Во-первых, адрес может быть числом как меньше 2 байт, так и больше, и в последнем случае мы его обрежем приведя к двухбайтному целому типу. Во-вторых, в Си нельзя разадресовать просто число, только какой-нибудь указатель. Такой вот уж стандарт языка, нету там простой конструкции "записать по адресу N", приходится по несколько раз приводить типы один к другому.

Re: Про Keil uVision 5

Добавлено: Ср июл 16, 2014 16:18:21
Myp3ik
baghear, может так :

*(__IO uint16_t *) (LCD_REG) = reg;

__IO он же volatile.

Re: Про Keil uVision 5

Добавлено: Ср июл 16, 2014 18:05:59
menzoda
Ну все, совсем человека запутали. Он и так с указателями на вы, а тут еще какой-то __IO и volatile.

Re: Про Keil uVision 5

Добавлено: Ср июл 16, 2014 19:43:39
baghear
Спасибо, приму как должное

Re: Про Keil uVision 5

Добавлено: Чт июл 17, 2014 00:28:25
baghear
Что такое volatile в курсе, а вот что такое __IO?

Re: Про Keil uVision 5

Добавлено: Чт июл 17, 2014 07:54:20
menzoda
Какое-нибудь макроопределение или typedef. Обычно производители вот так делают:

Код: Выделить всё

typedef volatile uint8_t*  __IO8;
typedef volatile uint16_t* __IO16;
typedef volatile uint32_t* __IO32;
Тогда объявления регистров будут такими:

Код: Выделить всё

#define REG_CON (*_IO16 (0xFFFFBBB0))
#define REG_STS (*_IO32 (0xFFFFBBB2))
#define REG_DBG (*_IO16 (0xFFFFBBB6))
Пользоваться как обычными переменными:

Код: Выделить всё

...
if (REG_STS == 0x25)
{
    REG_CON |= 0xFA1;
}
...

Re: Про Keil uVision 5

Добавлено: Чт июл 17, 2014 11:01:47
baghear
Спасибо!!!

Re: Про Keil uVision 5

Добавлено: Пт июл 18, 2014 01:15:06
baghear
Добрый день, что означает такая запись ?
#define assert_param(expr) ((void)0)
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

Re: Про Keil uVision 5

Добавлено: Пт июл 18, 2014 08:24:09
menzoda
На самом деле ничего. Любой assert_param в коде независимо от его параметра заменяется на конструкцию ((void)0), которая ничего не делает и игнорируется компилятором. Вообще, assert - это такая штука, которая валит программу с сообщением об ошибке, если переданный ей параметр равен нулю, или false. При отладке это может помочь найти всякие ошибки, вроде неправильного использования функции. Например:

Код: Выделить всё

void Foo(int a)
{
    // Программа аварийно завершиться, если мы передадим функции
    // значение меньше ста или больше тысячи.
    assert(a < 100);
    assert(a > 1000);

    ...
}
Когда программа отлажена и готова для выпуска, то все ассерты хорошо бы удалить, чтобы они не потребляли зря ресурсов. Шерстить все функции на их наличие не удобно, да и не всегда возможно, поэтому в файле, где объявлен assert (какой-нибудь assert.h), вводят конструкцию наподобие указанной тобой, чтобы все вызовы assert заменились препроцессором на нечто незначащее и были выкинуты компилятором. Вот так.

Re: Про Keil uVision 5

Добавлено: Пт июл 18, 2014 17:23:15
baghear
Спасибо, а (void) 0 - приведение нуля к типу?

Re: Про Keil uVision 5

Добавлено: Пт июл 18, 2014 17:46:18
menzoda
Да, если просто написать ноль, то компилятор возможно выдаст предупреждение о неиспользуемом значении, приведя его к void можно избежать этого. Лично я бы не стал использовать такую, несколько непривычную конструкцию для того, чтобы игнорировать вызов assert. По мне намного логичней выглядит такая запись:

Код: Выделить всё

#define assert(expr)
то есть, "пустое" макроопределение. В этом случае препроцессор не будет заменять его на незначащую конструкцию, а просто выкинет и все. Хотя, это дело вкуса.

Re: Про Keil uVision 5

Добавлено: Пт июл 18, 2014 18:19:45
baghear
Большое спасибо

Re: Про Keil uVision 5

Добавлено: Вт авг 26, 2014 18:31:31
eess9
Народ,подскажите пожалуйста.
Разбираюсь с lwIP стеком. Скачал пример с сайта st. В дереве проекта напротив двух файлов 3 вертикальных красных квадратика. Что это такое? Не разу не сталкивался. Это влияет на процесс компиляции?

Re: Про Keil uVision 5

Добавлено: Ср авг 27, 2014 08:21:04
dosikus
Это значит что настройки компиляции для этих файлов изменены и при компиляции будут задействованы именно они а не общие для проекта.
Клик правой кнопкой по этим файлам в менеджере проекта -> Options for file 'xxx' и смотри изменения ...

Re: Про Keil uVision 5

Добавлено: Вс сен 07, 2014 16:22:16
GHOST_J_D
Разбираюся с примером 3 отсюда http://radiokot.ru/articles/43/ плата влдешная, кейл5 выдает такую ошибку source\STM32_init\STM32_Init.c(31): error: #5: cannot open source input file "stm32f10x_lib.h": No such file or directory
#include "stm32f10x_lib.h" // STM32F10x Library Definitions
Скачивал новые библиотеки https://translate.googleusercontent.com ... pNpmO5EEiQ заменял файлы из примера на них, всеравно выдает тоже самое, в 3, 4, и 5 примерах.
Куда копать :( подскажите пожалуйста.

Re: Про Keil uVision 5

Добавлено: Вс сен 07, 2014 17:33:50
oleg110592
пробуйте #include "stm32f10x.h"
#include "stm32f10x_lib.h" похоже было в старых библиотеках (V2.x).
Лучше разбирать примеры от производителя (имхо).

Re: Про Keil uVision 5

Добавлено: Пн сен 08, 2014 04:50:26
GHOST_J_D
Переподключил в файле INIT.c
Начал компилить исходник.Но выдает 39 варнингов source\STM32_init\STM32_Reg.h(38): warning: #47-D: incompatible redefinition of macro "PWR_CR_DBP" (declared at line 1517 of ".\source\config\stm32f10x.h") такого плана. :( Может ктонибуть тыкнуть в рвбочие примеры. Заводские примеры stm32vldiscovery_package уже скачал.

Re: Про Keil uVision 5

Добавлено: Пн сен 08, 2014 07:05:05
oleg110592
В библиотеке STM32F10x standard peripheral library полно примеров, практически для всех "внутренностей" микроконтроллеров этой линейки:
STM32F10x StdPeriph_Lib Examples
The package contains the following examples:
ADC - BKP - CAN - CEC - CortexM3 - CRC - DAC - DMA - EXTI - FLASH - FSMC - GPIO - I2C - I2S - IWDG - Lib_DEBUG - NVIC - PWR - RCC - RTC - SDIO - SPI - SysTick - TIM - USART - WWDG
Так же есть готовые шаблоны для проектов IAR, Keil, Atolic TrueSTUDIO

Re: Про Keil uVision 5

Добавлено: Чт окт 30, 2014 19:26:39
baghear
Добрый день, подскажите почему программа не заходит в прерывание?
Спойлер#include "stm32f10x.h" // Device header
#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC

int main(void)
{
RCC_HSICmd(ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);

TIM4->PSC = 8000;
TIM4->ARR = 1000;
TIM4->DIER |= TIM_DIER_UIE;

NVIC_EnableIRQ (TIM4_IRQn);

TIM4->CR1 |= TIM_CR1_CEN;
__enable_irq ();

while(1)
{

}
}

void TIM4_IRQnHandler(void)
{
TIM4->SR &= ~TIM_SR_UIF;
}
Есть ли в keil флаг глобального разрешения прерываний, где его посмотреть?
Хотелось бы понять выполняется ли команда __enable_irq ();