Страница 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. По мне намного логичней выглядит такая запись:
то есть, "пустое" макроопределение. В этом случае препроцессор не будет заменять его на незначащую конструкцию, а просто выкинет и все. Хотя, это дело вкуса.
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 ();