سلام
من با کانتر و cmsis به نتیجه ای نرسیدم! کسی هم کمکم نکرد
ولی براتون یک چیز جالب دارم که NXP اونو از سایت پاک کرده بود!
این کتابخانه CMSIS برای LPC17XX با مثال هاش:
lpc17xx.cmsis.driver.library - Download - 4shared - reza sede
موفق باشین!
گفتن مثال برای قسمتهای راه اندازی شده
ادامه بحث و راه اندازی قسمتهای راه اندازی نشده
سلام
من با کانتر و cmsis به نتیجه ای نرسیدم! کسی هم کمکم نکرد
ولی براتون یک چیز جالب دارم که NXP اونو از سایت پاک کرده بود!
این کتابخانه CMSIS برای LPC17XX با مثال هاش:
lpc17xx.cmsis.driver.library - Download - 4shared - reza sede
موفق باشین!
سلام داداش ممنون بابت راهنمایی هایه قشنگت ولی من نفهمیدم آخرش با kile کار کنیم یا coide
سلام به همه ی دوستان و تشکر از ارسالهای خوبتون.من میخوام بدونم که توی محیط keil به چند روش میشه برنامه نوشت؟مثلأ اینکه جایی تو همین پست فرمودید "cmsis یک سری کتابخانه است که برنامه نویسی رو تو محیط keil ساده تر میکنه" از این سری کتابخونه ها بازم نوشته شده؟ چون مثالهای خود keil رو که باز میکنی مثلأ روش تعیین جهت پورت یا مقدار دهی به پورت رو اینجوری مینویسه که میخوام بدونم این از چه نوع کتابخو نه هاست؟
[PHP][/PHP]LPC_GPIO2->FIODIR = 0x00000001; /* P2.xx defined as Outputs */
LPC_GPIO2->FIOCLR = 0x00000001; /* turn off port2.xx*
ولی توی cmsis بر حسب کتابخانه هاش همین config رو باید اینجوری معرفی کنی:
[PHP][/PHP]GPIO_SetDir(2,0X00000001,1);
(GPIO_ClearValue(2,0X00000001
[HTML][/HTML]
این رو هم میدونم که یک روشم مطالعه ی لحظه به لحظه ی دیتا شیت خود میکرو در حین برنامه نویسی و مقدار دهی مستقیم به رجیستر هاست.
سلام
این دستورات تکنیک های کد نویسی در زبان C رو به صورت های متفاوت نشون میده و هیچ ربطی به نوع کامپایلر نداره. کتابخونه CMSIS در اصل کار رو یکم آسونتر کرده. یعنی شما دیگه نمیخواد با پوینترها و آدرس ها و رجیستر ها کار کنی. بلکه یکسری تابع رو مقدار دهی میکنی که همون کار رو براتون انجام میده. مثلا فرض کنید آدرس تعیین ورودی خروجی یک میکرو به صورت مقابل هست: GPSIO_DIR: 0x40008004
این رجیستر رو میتونی حداقل به این 3 صورت مقدار دهی کنی :
نوع اول که همون مقدار دهی مستفیم رجیستر ها است.کد:(*((volatile unsigned long *)0x40008004)) = 0x02; // Initializing with dereferencing operators LPC_GPIO2->FIODIR = 0x00000001; // Initializing using structural variable GPIO_SetDir(2,0X00000001,1); // Initializing using high level functions
نوع دوم مقدار دهی بر پایه رده یا همون ساختار (Structure) هست.
نوع سوم هم که با استفاده از توابع سطح بالا این عمل انجام شده و همه هم یک کار رو انجام میدن.
آقا ممنون،عالی بود.
این structure ها رو از کجا باید بیاریم؟مثلأ توی keil به طور پیش فرض میشه دیدشون که بفهمی هر کدومشون برای چه کای هست که ازشون استفاده کنی؟مثلأ از همین دستور دوم(به صورت 8بیتی) میشه تو codevisionavr هم استفاده کرد و همون نتیجه رو گرفت(و جای 2 نوشت a) یا اونجا متفاوت میشه؟
ویرایش توسط soojad : 22-09-2013 در ساعت 11:46
Structure یک نوع داده در زبان C هست.
برای مثال، کد بالا GPIO_Byte_TypeDef رو به صورت یک رده تعریف کرده. حالا شما میتونی متغییر های متفاوتی از این نوع داده ایجاد کنی. GPIO_Byte_TypeDef که در بالا تعریف شده شامل 6 تا ویژگی هست که داخل رده تعریف شدن. برای دسترسی به اعضای یک رده از علامت "." استفاده میشه و اگر به صورت Pointer تعریف شده باشه، دسترسی به اعضا با استفاده از "<-" انجام میشه. مثال:کد:typedef struct { __IO uint8_t FIODIR[4]; uint32_t RESERVED0[3]; __IO uint8_t FIOMASK[4]; __IO uint8_t FIOPIN[4]; __IO uint8_t FIOSET[4]; __O uint8_t FIOCLR[4]; } GPIO_Byte_TypeDef;
باز هم میگم این دستورات هیچ ربطی به Keil و یا IAR و یا کامپایلر دیگه ای نداره و اینها دستورات خود زبان C هستند. اگر یکم با این دستورات مشکل دارید، بهتره زبان C رو یک دوره ای بکنید. برای مثال این سری ویدو های دکتر بازرگان عالی هستند:کد:GPIO_Byte_TypeDef *pGPIO = GPIO_GetPointer(portNum); // As a Pointer pGPIO->FIODIR |= bitValue; // Access to the Structure elements GPIO_Byte_TypeDef pGPIO = GPIO_GetPointer(portNum); pGPIO.FIODIR |= bitValue; // Access to the Structure elements
http://maktabkhooneh.org/course?course=bazargan466
ویرایش توسط hossein1387 : 23-09-2013 در ساعت 06:26
سلام خدمت همگی. من با اینتراپت تایمر 0 مشکل دارم. برنامم مشکلی نداره ولی نمیدونم چرا تو روتین اینتراپت نمیره. کسی میتونه راهنمایی کنه؟
اینم برنامم.کد:void TIMER0_IRQHandler(){ if(f == 1){ f = 0; LPC_GPIO0->FIOSET = 0x01; } else{ f = 1; LPC_GPIO0->FIOCLR = 0x01; } LPC_TIM0->IR = 1; }
آقای طاهری من با اینتراپت تایمر 0 مشکل دارم. برنامه مشکلی نداره ولی تو روتین اینتراپت نمیره.
ممنون میشم اگه راهنمایی کنید .کد:#include <lpc17xx.h> char f; void TIMER0_IRQHandler(){ if(f == 1){ f = 0; LPC_GPIO0->FIOSET = 0x01; } if(f == 0){ f = 1; LPC_GPIO0->FIOCLR = 0x01; } LPC_TIM0->IR = 1; } int main(){ LPC_GPIO0->FIODIR |= 0x01; //LPC_PINCON->PINSEL3 |= (3UL << 24); LPC_TIM0->MR0 = 25000000; LPC_TIM0->MCR = 3; //LPC_TIM0->EMR |= (3UL << 4); LPC_TIM0->TCR = 3; LPC_TIM0->TCR = 1; NVIC_EnableIRQ(TIMER0_IRQn); while(1); }
سلام آقا اسماعیل دست شما درد نکنه واقعا زحمت کشیدی راستشو بخوای من تازه شروع کردم کارو میخواستم ببینم این فایلای هدر باید از کجا گیر بیاریم وکجا saveکنیم؟؟؟ راستی یا علی مدد
سلام به همه دوستان.
بعضی دوستان مثال برای adc در حالت burest میخواستن.من مثال خود شرکت nxp رو میزارم
/************************************************** ********************
* $Id$ adc_interrupt_test.c 2010-07-16
*//**
* @file adc_interrupt_test.c
* @brief This example describes how to use ADC conversion in
* burst mode
* @version 2.0
* @date 16. July. 2010
* @author NXP MCU SW Application Team
*
* Copyright(C) 2010, NXP Semiconductor
* All rights reserved.
*
************************************************** *********************
* Software that is described herein is for illustrative purposes only
* which provides customers with programming information regarding the
* products. This software is supplied "AS IS" without any warranties.
* NXP Semiconductors assumes no responsibility or liability for the
* use of the software, conveys no license or title under any patent,
* copyright, or mask work right to the product. NXP Semiconductors
* reserves the right to make changes in the software without
* notification. NXP Semiconductors also make no representation or
* warranty that such application will be suitable for the specified
* use without further testing or modification.
************************************************** ********************/
#include "lpc17xx_adc.h"
#include "lpc17xx_libcfg.h"
#include "lpc17xx_pinsel.h"
#include "debug_frmwrk.h"
#include "lpc17xx_gpio.h"
/* Example group ----------------------------------------------------------- */
/** @defgroup ADC_Burst Burst
* @ingroup ADC_Examples
* @{
*/
/************************** PRIVATE DEFINITIONS ***********************/
#define MCB_LPC_1768
//#define IAR_LPC_1768
#define MCB_LPC17XX_ADC_INJECT_TEST
#ifdef MCB_LPC_1768
#define MCB_LPC_1768_ADC_BURST_MULTI
#endif
#ifdef MCB_LPC_1768
#define _ADC_INT ADC_ADINTEN2
#define _ADC_CHANNEL ADC_CHANNEL_2
#ifdef MCB_LPC_1768_ADC_BURST_MULTI
#define _ADC_INT_3 ADC_ADINTEN3
#define _ADC_CHANNEL_3 ADC_CHANNEL_3
#endif
#elif defined(IAR_LPC_1768)
#define _ADC_INT ADC_ADINTEN5
#define _ADC_CHANNEL ADC_CHANNEL_5
#endif
/** DMA size of transfer */
#define DMA_SIZE 8
#ifdef MCB_LPC17XX_ADC_INJECT_TEST
#define GPIO_INT (1<<10)
#define POLL_LED (1<<4) // P1.28
#endif
/************************** PRIVATE VARIABLES *************************/
uint8_t menu1[] =
"************************************************* *******************************\n\r"
"Hello NXP Semiconductors \n\r"
" ADC burst demo \n\r"
"\t - MCU: LPC17xx \n\r"
"\t - Core: ARM CORTEX-M3 \n\r"
"\t - Communicate via: UART0 - 115200 bps \n\r"
" Use ADC with 12-bit resolution rate of 200KHz, running burst mode (single or multiple input)\n\r"
" Display ADC value via UART0\n\r"
" Turn the potentiometer to see how ADC value changes\n\r"
"************************************************* *******************************\n\r";
#ifdef MCB_LPC17XX_ADC_INJECT_TEST
static BOOL_8 toggle=FALSE;
#endif
/************************** PRIVATE FUNCTION *************************/
void print_menu(void);
#ifdef MCB_LPC17XX_ADC_INJECT_TEST
void EINT3_IRQHandler(void);
#endif
/*----------------- INTERRUPT SERVICE ROUTINES --------------------------*/
#ifdef MCB_LPC17XX_ADC_INJECT_TEST
void EINT3_IRQHandler(void)
{
if (GPIO_GetIntStatus(1, 10, 1))
{
GPIO_ClearInt(2,(1<<10));
toggle=~toggle;
#ifdef MCB_LPC_1768_ADC_BURST_MULTI
if(toggle)
{
ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL_3,ENABLE);
FIO_ByteSetValue(1, 3, POLL_LED);
}
else
{
ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL_3,DISABLE);
FIO_ByteClearValue(1, 3, POLL_LED);
}
#endif
}
}
#endif
/*-------------------------PRIVATE FUNCTIONS------------------------------*/
/************************************************** *******************//**
* @brief Print menu
* @param[in] None
* @return None
************************************************** ********************/
void print_menu(void)
{
_DBG(menu1);
}
/*-------------------------MAIN FUNCTION------------------------------*/
/************************************************** *******************//**
* @brief c_entry: Main ADC program body
* @param[in] None
* @return int
************************************************** ********************/
int c_entry(void)
{
PINSEL_CFG_Type PinCfg;
#ifdef MCB_LPC_1768_ADC_BURST_MULTI
PINSEL_CFG_Type PinCfg1;
#endif
uint32_t tmp;
uint32_t adc_value;
/* Initialize debug via UART0
* – 115200bps
* – 8 data bit
* – No parity
* – 1 stop bit
* – No flow control
*/
debug_frmwrk_init();
// print welcome screen
print_menu();
/* Because the potentiometer on different boards (MCB & IAR) connect
* with different ADC channel, so we have to configure correct ADC channel
* on each board respectively.
* If you want to check other ADC channels, you have to wire this ADC pin directly
* to potentiometer pin (please see schematic doc for more reference)
*/
#ifdef MCB_LPC_1768
/*
* Init ADC pin connect
* AD0.2 on P0.25
*/
PinCfg.Funcnum = 1;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = 0;
PinCfg.Pinnum = 25;
PinCfg.Portnum = 0;
PINSEL_ConfigPin(&PinCfg);
#ifdef MCB_LPC_1768_ADC_BURST_MULTI
/*
* Init ADC pin connect
* AD0.3 on P0.26
*/
PinCfg1.Funcnum = 1;
PinCfg1.OpenDrain = 0;
PinCfg1.Pinmode = 0;
PinCfg1.Pinnum = 26;
PinCfg1.Portnum = 0;
PINSEL_ConfigPin(&PinCfg1);
#endif
#elif defined (IAR_LPC_1768)
/* select P1.31 as AD0.5 */
PinCfg.Funcnum = 3;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = 0;
PinCfg.Pinnum = 31;
PinCfg.Portnum = 1;
PINSEL_ConfigPin(&PinCfg);
#endif
/* Configuration for ADC:
* select: ADC channel 2 (if using MCB1700 board)
* ADC channel 5 (if using IAR-LPC1768 board)
* ADC conversion rate = 200KHz
*/
ADC_Init(LPC_ADC, 200000);
ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL,ENABLE);
#ifdef MCB_LPC_1768_ADC_BURST_MULTI
ADC_ChannelCmd(LPC_ADC,_ADC_CHANNEL_3,ENABLE);
#endif
#ifdef MCB_LPC17XX_ADC_INJECT_TEST
FIO_ByteSetDir(1, 3, POLL_LED, 1);
FIO_ByteClearValue(1, 3, POLL_LED);
// Enable GPIO interrupt P2.10
GPIO_IntCmd(2,(1<<10),1);
NVIC_EnableIRQ(EINT3_IRQn);
#endif
//Start burst conversion
ADC_BurstCmd(LPC_ADC,ENABLE);
while(1)
{
#ifdef MCB_LPC_1768
adc_value = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_2);
_DBG("ADC value on channel 2: ");
#elif defined (IAR_LPC_1768)
adc_value = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_5);
_DBG("ADC value on channel 5: ");
#endif
_DBD32(adc_value);
_DBG_("");
#ifdef MCB_LPC_1768_ADC_BURST_MULTI
adc_value = ADC_ChannelGetData(LPC_ADC,ADC_CHANNEL_3);
_DBG("ADC value on channel 3: ");
_DBD32(adc_value);
_DBG_("");
#endif
// Wait for a while
for(tmp = 0; tmp < 1500000; tmp++);
}
ADC_DeInit(LPC_ADC);
return (0);
}
/* Support required entry point for other toolchain */
int main (void)
{
return c_entry();
}
#ifdef DEBUG
/************************************************** *****************************
* @brief Reports the name of the source file and the source line number
* where the CHECK_PARAM error has occurred.
* @param[in] file Pointer to the source file name
* @param[in] line assert_param error line source number
* @return None
************************************************** *****************************/
void check_failed(uint8_t *file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while(1);
}
#endif
/*
* @}
*/
سلام
آقا ممنون از زحماتتون
فقط اگر تو پست اول لیست مثال هایی که تو صفحات بعدی توضیح دادید رو میگذاشتید خیلی راحت تر بود تا اینکه بخوایم تمام این 36 صفحه رو مرور کنیم.
سلام برادر خسته نباشی
واقا ازت ممنونم خیلی نرم افزار خوبیه
یاعلی مدد
سلام خدمت همه دوستان مخصوصا جناب طاهری
در مورد intrrupt به شدت به مشکل بر خوردم
چندتا برنامه نوشتم که همش پایش اینتراپت هیچ کدوم به تابع وقفه پرش نمیکنه . دیگه سرم درد گرفت از صبح تا حالا پاش بودم
میخواستم بپرسم اگه میشه لطف کنید یه نگاه بهشون بندازید
#include <lpc17xx.h>
#include "lpc17xx_clkpwr.h"
#include "lpc_types.h"
#include "lpc17xx_nvic.h"
#include "lpc17xx_rit.h"
#include "lpc17xx_gpio.h"
void RIT_IRQHandler(void);
int main(void)
{
GPIO_SetDir(2,1,1);
RIT_Init(LPC_RIT);
RIT_TimerConfig(LPC_RIT,1000); // x in milisecond declared
NVIC_EnableIRQ(RIT_IRQn);
RIT_Cmd(LPC_RIT,ENABLE);
while(1)
{
}
}
void RIT_IRQHandler(void){
GPIO_SetValue(2,1);
RIT_GetIntStatus(LPC_RIT);
}
دومیه پاور rit رو بعدن روشن کردم البته اما بازم اینتراپت رو اجرا نمیکنه . با coide مینویسم
ممنون
ویرایش توسط s699fx : 11-11-2014 در ساعت 20:05
سلام.من هم این مشکلو دارم. وقتی اینتراپت میدم کلا میکرو قاطی میکنه
چرا این ارور رو میده؟ uart1 - lpc1768
سلام
سوال اول این دستور چکار میکنه؟
UART_GetIntId)(.
.
.
این جوابشه
Get Interrupt Identification value.
Parameters:
[in] UARTx UART peripheral selected, should be:
LPC_UART0: UART0 peripheral
LPC_UART1: UART1 peripheral
LPC_UART2: UART2 peripheral
LPC_UART3: UART3 peripheral
Returns:
Current value of UART UIIR register in UART peripheral.
خوب پس من میام میگم
intsrc = UART_GetIntId(LPC_UART1);
که این ارور رو دارم!
..\error: #167: argument of type "LPC_UART1_TypeDef " is incompatible with parameter of type "LPC_UART_TypeDef "
یعنی مردیکه اومدی میگی LPC_UART1_TypeDef بعد میخای بریزیش تو LPC_UART_TypeDef
بله همونطور متوجه شدین نوع ها بهم نمیخورن که همونطور بالا میبینین برای تعریف دستور نوشته
[in] UARTx UART peripheral selected, should be:
LPC_UART0: UART0 peripheral
LPC_UART1: UART1 peripheral
LPC_UART2: UART2 peripheral
LPC_UART3: UART3 peripheral
خوب من نوشتم uart1 ارور میگیره !
کسی میدونه چرا؟
با سلام و عرض خسته نباشید خدمت مهندس زرکوب /// مهندس جان بنده اموزش میکروی lpc1768 شما رو ویرایش قدیم تهیه کردم و فیلم هارو دیدم چند تا نکته بگم خدمتتون تا اموزش هاتون برای دفه های بعد تکمیل بشه //// مهندس جان بعضی جاها تلفظ کلمات اینگلیسی رو اشتباه میگفتی و در برنامه دستورات رو کامل توضیح نمیدادی به طور مثال اصلا توضیح ندادی اون تابع دیلی که اول مینویسی چطوری باعث دیلی میشه یا خیلی از جاهای دیگه شما توضیحاتت کامل نبوده براردر جان //// اینا همه به کنار داداشم خیلی جاها برنامتم مشکل داشته و وقتی من میبستم ارورو میداده
سلام داداش اسی خیلی گلی شما این همه زحمت کشیدی دمت گرم ////// من یه مشکلی دارم ///// توی قسمت uart0 یه دیتا رو میفرستم به لبتابم از طریق پورت rs232 اطلاعات رو هم دریافت میکنم ولی چرند دریافت میکنم بجا اینکه the number is 22 رو دریافت کنم کارکترای عجیبی دریافت میکنم اگر میشه لطف کن یه برنامه ساده با پورت uart0 که یه متن کوچکی رو ارسال کنه برام بنویس ممنون
- - - Updated - - -
داداش یه مثالی برن که یه کارکترو روی پورت uart0 ارسال کنم
ویرایش توسط mzarkoob : 01-03-2019 در ساعت 20:27